垃圾回收调优
GC调优始终优先处理新生代
阈值一般设置为75%或80%,预留一部分空间给浮动垃圾,避免CMS退化。
案例1:FullGC和MinorGC频繁。
问题分析:新生代内存空间过小,大量新创建的对象经常占满新生代内存空间(触发MinorGC频繁),并且幸存区空间紧张使得晋升阈值降低,导致很多生命周期较短的对象晋升至老年代,老年代存储大量生命周期很短的对象,进一步触发老年代的FullGC。
解决方案:通过观察监测工具中GC的详情,发现新生代内存设置过小,为其内存更大的内存空间,同时增大幸存区空间和晋升阈值,使得生命周期较小的对象无法晋升老年代。
案例2:请求高峰期发生FullGC,单词暂停时间特别长(CMS)
问题分析:CMS适用于低延迟的场景,因此该项目需求是低延迟,通过监测GC详情,找到导致单次暂停时间最长的阶段(初始标记、并发标记、重新标记、并发清理),发现是重新标记阶段花费时间较长。
解决方案:由于重新标记会扫描整个堆的所有对象,因此在重新标记前设置一次垃圾清理(设置下图所示参数),减少扫描次数。
案例3:老年代充裕情况下,发生FullGC(1.7)
问题分析:jdk版本为1.7,采用的是永久代作为方法区的实现,在1.7及更早的jdk版本中,永久代空间不足也会导致FullGC的发生。
解决方案:增大永久代内存空间。