问题及原因分类
FGC问题分类
目前遇到的FGC问题主要分为两大类:
- FGC频繁(频率高);
- 停顿时间长(FGC持续时间长);
FGC原因分类
引发FGC问题的原因也主要分为两大类:
- JVM参数设置不合理;
- 程序Bug;
FGC频繁排查
JVM参数不合理
Young与Old比例不合理
- Old空间占比过小;
Eden与Survivor比例不合理
- Eden过小(晋升速率提高);
- Survivor过小(空间溢出);
晋升阈值不合理
- -XX:MaxTenuringThreshold=N过小(晋升速率提高);
CMS参数不合理
- CMS触发时机过早(-XX:CMSInitiatingOccupancyFraction=N过小);
- 空间碎片太多(开启碎片整理UseCMSCompactAtFullCollection,设置合理整理周期CMSFullGCsBeforeCompaction);
- FGC前没有触发YGC(开启-XX:+CMSScavengeBeforeRemark);
程序Bug
- 存在内存泄露(最终导致OOM);
- 存在大对象;
FGC持续时间长
JVM参数不合理
Old区过大
CMS参数不合理
- CMS触发时机太晚,导致“concurrent mode failure”;
- 空间碎片整理周期过短(调大CMSFullGCsBeforeCompaction);
参考: