evacuation failure 是 g1 碎片化的直接信号,表明本次 young gc 无法为存活对象找到足够连续空闲 region 完成疏散,比 to-space exhausted 更严重,通常伴随半空 region 增多、full gc 风险极高。

Evacuation Failure 是 G1 碎片化的直接信号,不是间接推测
看到 Evacuation Failure 就说明 G1 在本次 Young GC 中已无法为存活对象找到足够大的空闲 Region(尤其是 to-space),这比 to-space exhausted 更严重——后者只是复制目标空间不足,而前者意味着连疏散动作本身都失败了,通常伴随大量 Region 处于“半空”状态。它不依赖堆使用率高低,只取决于 Region 空间是否能凑出连续块。一旦日志中出现该字样,碎片已实质性影响分配,Full GC 风险极高。
结合 GC 日志中的三项关键指标交叉验证
单看 Evacuation Failure 不足以判断是否已达 Full GC 临界值,必须同步检查:
-
Heap: X->Y(Z)中 Y 接近 Z(例如 6078.3M→4718.0M(6144.0M)),说明回收收益极低,Region 碎片导致对象无法有效疏散 - 日志紧随其后出现
GC concurrent-mark-abort或Mixed GC未如期触发,表明并发标记周期被中断或 Mixed GC 因 CSet 构建失败而跳过,G1 已失去自主回收能力 - 出现
Full GC (Allocation Failure)前 1–2 次 GC 中有to-space exhausted,且Other阶段耗时 >100ms(见PrintGCDetails日志),这是 G1 花费大量时间尝试拼凑 Region 的铁证
G1ReservePercent 和 IHOP 设置不当会加速临界到来
-XX:G1ReservePercent 默认 10%,本质是预留一部分 Region 应对疏散失败;-XX:InitiatingHeapOccupancyPercent(IHOP)默认 45%,决定何时启动并发标记。这两者共同影响 G1 对碎片的缓冲能力:
AI 舌诊面诊问诊医疗系统 + 诊疗商城系统源码是一套结合 AI 辅助诊断与商品转化的健康类程序,基于浩创云、ThinkPHP(PHP)开发,支持微信服务号与 H5 端,适合做中医舌诊面诊问答、健康建议推送以及配套诊疗商品的运营。
- 若频繁出现
Evacuation Failure但堆总使用率仅 60%~70%,大概率是G1ReservePercent过小,应逐步调高至 15%~20%(注意上限 50%) - 若
Evacuation Failure总在并发标记刚启动后不久发生,说明 IHOP 设得太高,标记太晚,应降低至 35%~40%,让 Mixed GC 更早介入清理老年代 Region - 切忌同时调高两者:预留太多 Region 会压缩可用内存,反而加剧年轻代压力,诱发更多 Young GC 和疏散失败
真正危险的不是 Evacuation Failure 本身,而是它不再孤立出现
单次 Evacuation Failure 可能只是偶发大对象分配冲击;但若在 5 分钟内重复出现 ≥3 次,且每次之后都伴随:
- Young GC 耗时持续上升(如从 50ms → 120ms)
-
Object Copy阶段占比超过 45%(见Parallel Time子项) - Free CSet 数量远小于 Total CSet(日志中
Free CSet: 12 / Total CSet: 47类似情况)
此时碎片已形成稳定瓶颈,G1 无法靠自身机制恢复,Full GC 几乎必然发生——这不是预测,是倒计时。










