本文旨在简明扼要阐明各回收器调优参数,如有疏漏欢送斧正。

1、JDK版本

以下所有优化全副基于JDK8版本,强烈建议低版本升级到JDK8,并尽可能应用update_191当前版本。

2、如何抉择垃圾回收器

响应优先利用:面向C端对响应工夫敏感的利用,堆内存8G以上倡议抉择G1,堆内存较小或低版本JDK抉择CMS;

吞吐量优先利用:对响应工夫不敏感,以高吞吐量为指标的利用(如MQ、Worker),倡议抉择ParallelGC;

3、各回收器优化参数

1)基本参数配置(所有利用、所有回收器都须要):

-Xmx(个别为容器内存的50%)

-Xms(与Xmx统一)

-XX:MetaspaceSize(通常256M~512M)

-XX:ParallelGCThreads=容器核数

-XX:CICompilerCount=容器核数(必须大于等于2)

2)ParallelGC

除以上参数外,个别不须要额定调优(JDK8默认回收器)

3)CMS

-XX:+UseConcMarkSweepGC

-Xmn (个别为堆内存的三分之一),尤其是配置了ParallelGCThreads后必须配置此参数

-XX:ConcGCThreads=n(默认为ParallelGCThreads/4,可视状况调整至ParallelGCThreads/2)

-XX:+UseCMSInitiatingOccupancyOnly

-XX:CMSInitiatingOccupancyFraction=70(推荐值)

4)G1

-XX:+UseG1GC

-XX:ConcGCThreads=n(默认为ParallelGCThreads/4,可视状况调整至ParallelGCThreads/2)

-XX:G1HeapRegionSize=8m(若堆内存在8G以内且有较多大对象举荐设置此值)

*留神不要设置-Xmn 和 XX:NewRatio

5)其余调优参数

-XX:+ParallelRefProcEnabled 如果GC时Reference解决工夫较长,例如大量应用WeakReference对象,能够通过此参数开启并行处理

4、开启GC日志

-XX:+PrintGCDetails

-XX:+PrintGCDateStamps

-Xloggc:/export/Logs/gc.log

5、如何判断GC是否失常

1)GC是否频繁:YoungGC频率个别几十秒钟一次,FullGC个别每天几次,留神G1回收器不应该呈现FullGC;

2)GC耗时:耗时次要取决于堆内存大小及垃圾对象数量。YoungGC工夫通常应在几十毫秒,FullGC通常在几百毫秒;

3)每次GC内存是否降落:利用刚启动时,每次YoungGC内存应该回收到较低水位,随着时间推移老年代逐渐增多,内存水位会逐渐上涨,直到FullGC/MixedGC(G1),内存会再次回到较低水位,否则可能存在内存透露;

4)如果应用ParallelGC,堆内存耗尽才会触发FullGC,所以不必配置堆内存使用率告警,但需关注GC频率;

5)泰山上能够巡检局部JVM配置。

作者:京东批发 王利辉

起源:京东云开发者社区