中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
鲲鹏小智

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
  1. 通过上面监控信息,YGC(Young GC/Minor GC)共执行了4次,也就是第579、580、581和582次;FGC(FULL GC)没有执行。
  2. 计算GC频率:监控信息每秒打印一次,YGC标号为580的信息打印了8次,也就是说从上次GC完毕等了8s时间触发了YGC,下次打印就进入了581记录区域。也就是说YGC频率是8秒1次。同样方法可以计算FGC的频率。
  3. 计算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次

修改方式

排查调优步骤和建议:

  1. FGC过于频繁,检查业务是否有显示调用System.gc()代码,确认是否为业务触发FGC。优化业务代码删掉不必要的显示调用FGC,或者设置-XX:DisableExplicitGC关闭显示调用:
    # /path/java -XX:DisableExplicitGC <other parameters>  
  2. FGC过于频繁,建议尝试调大永久代(Perm区)空间或者调大老年代空间,具体设置参数见设置JVM堆空间大小
  3. YGC过于频繁,建议尝试调大年轻代空间或者调大整个堆空间,具体设置参数见设置JVM堆空间大小。如果业务应用对象生成过多不能重复使用,也可以尝试优化业务代码降低YGC的频率。
  4. YGC耗时过长,建议尝试缩小年轻代空间大小或者调小整个堆空间,具体设置参数见设置JVM堆空间大小
  5. FGC/YGC耗时过长,系统CPU资源不是瓶颈场景下可尝试增加GC线程数量,具体设置方法参考JVM线程优化
  1. GC优化需要结合业务分析,了解业务特点再做针对性优化。
  2. 堆空间调大或者调小,均会带来优点和缺点,根据业务性能关注点决定。
    1. 更大的年轻代会使老年代变小,大的年轻代会延长YGC的周期,但会增加每次YGC的耗时;小的老年代会增加FGC的频率。
    2. 更小的年轻代会使老年代变大,小的年轻代会导致YGC很频繁,但每次YGC耗时会减少;大的老年代会减少FGC的频率。
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词