GC分析优化
原理
每次GC过程都是对JVM堆空间的整理,JVM执行GC业务进程会进入暂停状态,GC优化的总体方向是尽可能减少对业务的影响。总体来说,GC调优是尽量降低GC频率和每次GC停顿时间。可以通过GC日志和jstat工具对GC进行实时监控分析和调优。
下面是jstat命令每隔1s打印的GC信息,内容只保留了GC频率和耗时相关的列信息,其他列未列出。jstat命令试用方法和输出信息说明,请参考jstat工具。
YGC YGCT FGC FGCT GCT 579 22.233 2 0.090 22.323 579 22.233 2 0.090 22.323 579 22.233 2 0.090 22.323 579 22.233 2 0.090 22.323 579 22.233 2 0.090 22.323 579 22.233 2 0.090 22.323 579 22.233 2 0.090 22.323 579 22.233 2 0.090 22.323 580 22.262 2 0.090 22.352 580 22.262 2 0.090 22.352 580 22.262 2 0.090 22.352 580 22.262 2 0.090 22.352 580 22.262 2 0.090 22.352 580 22.262 2 0.090 22.352 580 22.262 2 0.090 22.352 580 22.262 2 0.090 22.352 581 22.282 2 0.090 22.372 581 22.282 2 0.090 22.372 581 22.282 2 0.090 22.372 581 22.282 2 0.090 22.372 581 22.282 2 0.090 22.372 581 22.282 2 0.090 22.372 581 22.282 2 0.090 22.372 582 22.282 2 0.090 22.372 582 22.300 2 0.090 22.391 582 22.300 2 0.090 22.391 582 22.300 2 0.090 22.391 582 22.300 2 0.090 22.391 582 22.300 2 0.090 22.391 582 22.300 2 0.090 22.391 582 22.300 2 0.090 22.391
- 通过上面监控信息,YGC(Young GC/Minor GC)共执行了4次,也就是第579、580、581和582次;FGC(FULL GC)没有执行。
- 计算GC频率:监控信息每秒打印一次,YGC标号为580的信息打印了8次,也就是说从上次GC完毕等了8s时间触发了YGC,下次打印就进入了581记录区域。也就是说YGC频率是8秒1次。同样方法可以计算FGC的频率。
- 计算GC耗时(业务停顿时间):YGCT表示从Java进程启动开始所有YGC累计执行的总时间,计算一次YGC耗时,只需将后一个YGC标号时间减去当前YGC标号时间即可。例如,第580次YGC执行时间为:22.282(YGCT 581标号值)减去22.262(YGCT 580标号值)的值,也就是20毫秒。同样方法可以计算FGC耗时。随业务运行压力不同,GC耗时可能会有变动。
关于GC频率和GC耗时在什么范围内比较合理这个问题,没有统一答案,它们的值和服务器硬件资源(例如内存大小、CPU处理能力)和软件相关,每个业务不尽相同。
参考建议:
- YGC平均耗时小于50毫秒
- YGC执行频率不低于10秒1次
- FGC平均耗时小于1秒
- FGC执行频率不低于10分钟1次
修改方式
排查调优步骤和建议:
- FGC过于频繁,检查业务是否有显示调用System.gc()代码,确认是否为业务触发FGC。优化业务代码删掉不必要的显示调用FGC,或者设置-XX:DisableExplicitGC关闭显示调用:
# /path/java -XX:DisableExplicitGC <other parameters>
- FGC过于频繁,建议尝试调大永久代(Perm区)空间或者调大老年代空间,具体设置参数见设置JVM堆空间大小。
- YGC过于频繁,建议尝试调大年轻代空间或者调大整个堆空间,具体设置参数见设置JVM堆空间大小。如果业务应用对象生成过多不能重复使用,也可以尝试优化业务代码降低YGC的频率。
- YGC耗时过长,建议尝试缩小年轻代空间大小或者调小整个堆空间,具体设置参数见设置JVM堆空间大小。
- FGC/YGC耗时过长,系统CPU资源不是瓶颈场景下可尝试增加GC线程数量,具体设置方法参考JVM线程优化。
- GC优化需要结合业务分析,了解业务特点再做针对性优化。
- 堆空间调大或者调小,均会带来优点和缺点,根据业务性能关注点决定。
- 更大的年轻代会使老年代变小,大的年轻代会延长YGC的周期,但会增加每次YGC的耗时;小的老年代会增加FGC的频率。
- 更小的年轻代会使老年代变大,小的年轻代会导致YGC很频繁,但每次YGC耗时会减少;大的老年代会减少FGC的频率。
父主题: 优化调优方法