转载

JVM如何选择垃圾收集器呢,以及JVM的设置参数,JVM常见命令和工具

如何选择垃圾收集器呢

1.优先调整堆的大小,让服务器自己来选择

2.如果内存小于100M,使用串行收集器 SerialGC

3.如果是单核,并且没有停顿时间要求,使用串行或JVM自己选 SerialGC

4.如果允许停顿时间超过1秒,选择并行或JVM自己选 ParallelGC

5.如果响应时间最重要,并且不能超过1秒,使用并发收集器,CMS或者G1

6.对于G1收集

示例:

参数:-XX:+UseConcMarkSweepGC


JVM参数:不仅仅药设置的是垃圾收集器,内存,等等

1.标准参数:不随着jdk版本变化而变化的参数 

例如:-version -help

2.非标准参数:-X参数

例如:java -version是mixed mode

  

java -Xint -version 是解释执行

  

java -Xcomp -version

3.-XX参数:

boolean型,

如: -XX:+UseG1GC 启用

        -XX:-UseG1GC 禁用

key:value型

-XX:MaxGCPauseMillis=500

-XX:HeapSize=100MB

(4)其他参数:

-Xms100M   -->  -XX:InitialHeapSize=100M,

-Xmx --> -XX:MaxHeapSize=100M,

-Xss --> -XX:ThreadStackSize=xxx



-XX:+PrintFlagsFinal可以打印jvm参数

  

打印出来的有冒号的表示是修改过的值


JVM常用参数含义

参数 含义 说明
-XX:CICompilerCount 最大并行编译数 如果设置大于1,虽然编译速度会提高,但是同样影响系统稳定性,会增加JVM崩溃的可能
-XX:InitialHeapSize=100M 初始化堆大小 简写-Xms100M
-XX:MaxHeapSize=100M 最大堆大小 简写-Xmx100M
-XX:NewSize=20M 设置年轻代的大小  
-XX:MaxNewSize=50M 设置最大年轻代大小  
-XX:OldSize=50M 设置老年代大小  
-XX:MetaspaceSize=50M 设置元空间大小(方法区)  
-XX:MaxMetaspaceSize=50M 方法区最大大小  
-XX:+UseParallelGC 使用UseParallelGC 新生代,吞吐量优先
-XX:+UseParallelOldGC 使用UseParallelOldGC 老年代,吞吐量优先
-XX:+UseConcMarkSweepGC 使用CMS 老年代,停顿时间优先
-XX:+UseG1GC 使用G1 新生代,老年代,停顿时间优先
-XX:NewRatio 新老生代的比值 比如-XX:NewRatio=4,则标识新生代:老年代=1:4,也就是新生代占整个堆内存的1/5
-XX:SurvivorRatio 两个S区和Eden区的比值 比如-XX:SurvivorRatio=8,也就是(S0+S1):Eden=2:8,也就是一个S占整个新生代的1/10
-XX:+HeapDumpOnOutOfMemoryError 启动堆内存溢出打印 当JVM堆内存发生溢出时,也就是OOM,自动生成dump文件
-XX:HeapDumpPath=heap.hprof 指定堆内存溢出打印目录 表示在当前目录生成一个heap.hprof文件
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc:$CATALINA_HOME/logs/gc.log
打印出GC日志 可以使用不同的垃圾收集器,对比查看GC情况
-Xss128K 设置每个线程的堆栈大小 经验值是3000-5000最佳
-XX:MaxTenuringThreshold=6 提升老年代的最大临界值 默认值为15
-XX:InitiatingHeapOccupancyPercent=45 启动并发GC周期时堆内存使用占比 G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比。值为0,则表示“一直执行GC循环”,默认值为45
-XX:G1HeapWastePercent 允许的浪费堆空间的占比 默认是10%,如果并发标记可回收的空间小于10%,则不会出发MixedGC
-XX:MaxGCPauseMillis=200ms G1最大停顿时间 暂停时间不能太小,太小的话就会导致出现G1跟不上垃圾产生的速度,最终退化成FullGC.所以堆这个参数的调优是一个持续的过程,逐步调整到最佳状态。
-XX:ConcGCThreads=n 并发垃圾收集器使用的线程数量 默认值随JVM运行的平台不同而不同
-XX:G1MixedGCLiveThresholdPercent=65 混合垃圾回收周期中要包括的旧区域设置占用率阈值 默认占用率为65%
-XX:G1MixedGCCountTarget=8 设置标记周期完成后,对存活数据上限为G1MixedGCLiveThresholdPercent的旧区域执行混合垃圾回收的目标次数 默认8次混合垃圾回收,混合回收的目标是要控制在次目标次数以内
-XX:G1OldCSetRegionThresholdPercent=1 描述Mixed GC时,Old Region被加入到Set中 默认情况下,G1只把10%的Old Region加入到Cset中

常见命令和工具

JAVA进程--->jps

1.jps:查看当前的java进程

2.jinfo:实时查看和调整JVM参数

例如:jinfo -flag InitialHeapSize PID  实时查看某个JAVA进程的初始化堆内存大小

或者:jinfo -flags PID 查看进程的所有JVM参数

3.实时修改JVM参数

jinfo -flag name = value PID

如果要对参数进行实时调整:则需要看到参数后面有manageable的才能被实时调整

     

4.jstat

查看虚拟机性能信息

jstat -calss PID 1000 10   查看类装载信息:查看class在过去10秒钟的的某一个进程的装载信息

  

除此之外,还可以打印GC的信息

jstat -gc PID 1000 10  
  


5.jstack
线程堆栈信息

jstack pid

查看当前java进程中有多少个线程,以及每个线程的状态

比如写了一个死锁,可以快速排查

  

6.堆内存:heap

 Thread--->优雅名字--->order-t1 Thread-0 /1/2/3/4

jmap:查看堆存储快照

jmap -heap PID


新生代42.5M,老年代85.5M

  



heap:如果在生产环境,堆内存发生OOM的时候,能够自动把堆内存信息打印出来就好了  ,heap信息打印出来,排查,哪些对象占用

dump出堆内存相关的信息

(1)手动

jmap -dump:format=b,file=heap.hprof PID ,这个文件是看不懂的,需要用到工具

介绍几款:

①jconsole,jdk自带的

②jvisualvm,jdk自带的,可以装个插件看内存使用情况,插件名称:com-sun-tools-visualvm-modules-visualgc.nbm去百度搜索下载吧

  

如果检测到死锁,这里会显示:

  

还可以添加远端的服务器,监控远程服务器

   

  

  

 

不是jdk自带的---> Arthas

以上可以看到:线程,cpu,class,堆内容简单情况


(2)自动

能够在发生OOM的时候,自动dump下来就在前面的参数设置

-XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=heap.hprof


正文到此结束
本文目录