常见配置汇总
典型设置
-Xms:初始堆大小
-Xmx:最大堆大小
-Xmn:年轻代大小
-Xss:每个线程的堆栈大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值.如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值.注意Survivor区有两个.如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n:设置永久代大小 // 1.8之后是设置元空间
-XX:MAXTenuringThreshold =0 : 设置垃圾最大年龄,设置为0的话,则年轻代对象不经过Survivor区,直接进入老年代
-xx:metaspaceSize 元数据空间大小
回收器选择
-XX:+UseParallelGC : 选择垃圾收集器为并行收集器,此配置竞对年轻代有效,及上述配置下,年轻代使用并发手机
-XX:ParallelGCThreads=20:配置并行收集器的线程数
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例
-XX:+UseConcMarkSweepGC:设置年老代为并发收集
## CMS 一个响应时间优先的垃圾收集器
-XX:+UseConcMarkSweepGC 新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:+UseParNewGC 新生代使用并行收集器,老年代CMS收集器默认开启
-XX:CMSInitiatingOccupanyFraction 设置触发GC的阈值,默认68%,如果内存预留空间不够,就会引起concurrent mode failure
-XX:+UseCMSCompactAtFullCollection Full GC后,进行一次整理,整理过程是独占的,会引起停顿时间变长
-XX:+CMSFullGCsBeforeCompaction 设置进行几次Full GC后进行一次碎片整理
-XX:+CMSClassUnloadingEnabled 允许对类元数据进行回收
-XX:+UseCMSInitiatingOccupanyOnly 表示只在达到阈值的时候才进行CMS回收
-XX:+CMSIncrementalMode 使用增量模式,比较适合单CPU
## G1 (G1是兼顾吞吐量和响应时间的收集器)
-XX:G1HeapRegionSize 设置Region大小,默认heap/2000
-XX:G1MixedGCLiveThresholdPercent 老年代依靠Mixed GC, 触发阈值
-XX:G1OldSetRegionThresholdPercent 定多包含在一次Mixed GC中的Region比例
-XX:+ClassUnloadingWithConcurrentMark G1增加默认开启,在并发标记阶段结束后,JVM即进行类型卸载
-XX:G1NewSizePercent 新生代的最小比例
-XX:G1MaxNewSizePercent 新生代的最大比列
-XX:G1MixedGCCountTraget Mixed GC数量控制
辅助信息
-XX:PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间
-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间
-XX:PrintHeapAtGC:打印GC前后的详细堆栈信息
-Xloggc:filename 把日志信息记录到文件以便分析
-XX:OnOutOfMemoryError 当发生OOM时执行用户指定的命令
-XX:+HeapDumpPath OOM时堆导出的路径
-XX:+TraceClassLoading 跟踪类加载信息
GC调优
通常关注两个指标:响应性,吞吐量。通常考虑堆大小和垃圾收集器的调整。
思路
- 分析场景,如:启动速度慢,偶尔出现响应慢于平均水平或出现卡顿
- 确定目标,如:内存占用,低延时,吞吐量
- 收集日志,如:通过参数配置收集GC日志,通过JDK工具查看GC状态
- 分析日志,如:使用工具辅助分析日志,查看GC次数,GC时间
- 调整参数,如:切换垃圾收集器或者挑战垃圾收集器参数