前言
本文是京东交易链路众多核心应用GC优化经验的总结,旨在简明扼要说明各种回收器的基本调优设置,为各应用GC配置提供指引。
以下所有优化全部基于JDK8版本,强烈建议低版本升级到JDK8,并尽可能使用update_191以后版本。
响应优先应用:面向C端对响应时间敏感的应用,堆内存8G以上建议选择G1,堆内存较小或低版本JDK选择CMS;
【基本参数配置(所有应用、所有回收器都需要)】
-
Xmx(一般为容器内存的50%)
-
Xms(与Xmx一致) -
XX:MetaspaceSize(通常256M~512M) -
XX:ParallelGCThreads=容器核数 -
XX:CICompilerCount=容器核数(必须大于等于2)
【ParallelGC】
除以上参数外,一般不需要额外调优(JDK8默认回收器)
【CMS】
-
XX:+UseConcMarkSweepGC -
Xmn (一般为堆内存的三分之一),尤其是配置了ParallelGCThreads后必须配置此参数 -
XX:ConcGCThreads=n(默认为ParallelGCThreads/4,可视情况调整至ParallelGCThreads/2) -
XX:+UseCMSInitiatingOccupancyOnly -
XX:CMSInitiatingOccupancyFraction=70(推荐值)
【G1】
-
XX:+UseG1GC -
XX:ConcGCThreads=n(默认为ParallelGCThreads/4,可视情况调整至ParallelGCThreads/2) -
XX:G1HeapRegionSize=8m(若堆内存在8G以内且有较多大对象推荐设置此值)
【其他调优参数】
-
XX:+ParallelRefProcEnabled 如果GC时Reference处理时间较长,例如大量使用WeakReference对象,可以通过此参数开启并行处理
-
XX:+PrintGCDetails -
XX:+PrintGCDateStamps -
Xloggc:/export/Logs/gc.log
-
GC是否频繁:YoungGC频率一般几十秒钟一次,FullGC一般每天几次,注意G1回收器不应该出现FullGC。 -
GC耗时:耗时主要取决于堆内存大小及垃圾对象数量。YoungGC时间通常应在几十毫秒,FullGC通常在几百毫秒。 -
每次GC内存是否下降:应用刚启动时,每次YoungGC内存应该回收到较低水位,随着时间推移老年代逐步增多,内存水位会逐步上涨,直到FullGC/MixedGC(G1),内存会再次回到较低水位,否则可能存在内存泄漏。 -
如果使用ParallelGC,堆内存耗尽才会触发FullGC,所以不用配置堆内存使用率告警,但需关注GC频率。
本文仅供学习!所有权归属原作者。侵删!文章来源: 京东零售技术 -交易研发 王利辉 :http://mp.weixin.qq.com/s/MwTvQtQwaHgR_ey6IkHD_w
文章评论