出现“survivor overflow”等日志表明G1混合回收链断裂,年轻代对象晋升失控,导致老年代碎片化、Mixed GC失效甚至Full GC;需清除错误参数、调整Region大小与年龄阈值,并持续观察三轮GC周期验证效果。

看到日志里出现“survivor overflow”“to-space overflow”或“Survivor space exhausted”,基本可以判定:G1的混合回收(Mixed GC)链条已经断裂,不是小问题,而是年轻代对象晋升路径失控的明确信号。
盯紧Young GC日志里的溢出标记
这类字样几乎只出现在Young GC阶段的日志中,说明疏散(evacuation)时目标Survivor区容量不足。例如:[GC pause (G1 Evacuation Pause) (young) (to-space overflow)]
这不是偶然抖动,意味着部分对象被跳过Survivor,直接晋升到老年代——后续会引发老年代碎片堆积、Mixed GC效果变差、甚至触发Full GC。
结合Mixed GC日志交叉验证断层程度
单看溢出还不够,要同步检查随后发生的Mixed GC日志:
- 老年代回收量极低(比如
800M->795M,仅回收5MB) - 回收比例R远低于0.3(健康阈值),说明老年代塞满“早产对象”,空间不连续,标记-清除效率崩溃
- 紧跟其后出现
Full GC after mixed GC或Concurrent Cycle Abort,代表G1已放弃混合策略,降级为STW式强杀
排查三类典型配置失配
溢出本质是G1预估失败,根源常在人为干预破坏了它的自适应机制:
- 误设
-XX:SurvivorRatio或-XX:NewRatio:这两项会锁死Survivor大小,让G1无法按堆占用动态伸缩;应彻底去掉,交由G1自主管理 -
MaxTenuringThreshold设得过高(如默认15),但实际日志里多数对象在age=1就晋升了,说明Survivor根本没用上;建议调至3~5,并同步降低InitiatingHeapOccupancyPercent(如从45%→35%),让并发标记提前介入 - Region尺寸与堆不匹配:比如4GB堆配默认2MB Region(共2048个),Survivor只能分到2~4个Region(4~8MB),完全扛不住中等流量;可改用
-XX:G1HeapRegionSize=4M,减少Region总数,扩大单个Survivor容量
优化后必须看趋势,不看单点
调参后别急着下结论,连续观察至少3轮GC周期:
- Young GC中
to-space overflow是否消失 - Mixed GC的老年代回收量是否回升、R值是否稳定在0.3以上
- Full GC是否不再穿插出现
不复杂但容易忽略










