Allocation Failure 表示新生代空间不足触发 Minor GC,是对象分配失败的直接信号;Ergonomics 表示 JVM 自适应策略触发的 Full GC,属预防性全堆回收,反映老年代压力或配置失衡。

Allocation Failure 和 Ergonomics 是 GC 日志中两个关键的触发原因标记,它们分别指向不同层级的内存压力与 JVM 决策逻辑,直接关系到性能瓶颈定位和调优方向。
Allocation Failure:新生代空间耗尽的明确信号
它出现在 [GC (Allocation Failure) 中,表示一次 Minor GC(年轻代回收)被触发,根本原因是:JVM 尝试在 Eden 区分配新对象时,发现没有连续可用空间,且无法通过 Minor GC 清出足够空间来满足本次分配请求。
- 这不是“偶尔抖动”,而是新生代配置或对象生命周期存在明显问题的标志
- 高频出现意味着 Eden 太小、对象晋升过快、或存在短生命周期大对象(如临时 byte[]、JSON 解析结果)
- 日志中紧随其后的
PSYoungGen: A->B(C)可用于验证:若回收后 Eden 使用量(B)仍接近上限(C),说明对象存活率高或 GC 效率低
Full GC (Ergonomics):JVM 主动干预的老年代风险预警
它出现在 [Full GC (Ergonomics) 中,代表一次 Full GC,但并非因内存彻底耗尽而被动触发,而是 JVM 基于运行时统计(如 GC 频率、晋升速率、停顿时间目标)主动发起的“预防性”老年代整理。
- 常见于开启了自适应策略(
-XX:+UseAdaptiveSizePolicy,默认开启)的 Parallel GC 或 G1 场景 - 典型诱因包括:连续多次 Minor GC 后,老年代增长过快;预测下次晋升将超出老年代剩余空间;或期望停顿时间持续超标
- 注意它不等于配置错误,但若频繁发生(如每几分钟一次),说明堆结构失衡——比如年轻代过小导致大量对象过早晋升,或老年代碎片化严重
如何快速区分二者影响范围
看日志结构比看括号文字更可靠:
-
[GC (Allocation Failure)日志中只有PSYoungGen字段(或ParNew、G1 Young Generation),无ParOldGen或Metaspace显式变化 → 纯年轻代事件 -
[Full GC (Ergonomics)日志中必然同时出现PSYoungGen、ParOldGen(或G1 Old Generation)、可能含Metaspace→ 涉及全堆,STW 时间显著更长(通常 >100ms) - 对比前后总堆占用(如
98829K->98200K(544256K)):若回收后总使用量下降不明显,甚至上升,往往暗示老年代已逼近饱和或存在内存泄漏
下一步该查什么
不要只盯括号里的词:
- 对 Allocation Failure:检查相邻几次 Minor GC 的
->差值(如31073K->4210K),若存活对象长期稳定在 3–4K 以上,说明有对象在 Survivor 区反复复制未晋升,需调大 SurvivorRatio 或检查对象年龄阈值 - 对 Ergonomics Full GC:重点看
ParOldGen行的回收效果(如83468K->98200K反而变大),这常意味着 CMS 失败退化、G1 Mixed GC 未覆盖足够区域,或元空间膨胀挤占老年代 - 配合
-XX:+PrintGCTimeStamps和时间戳,观察触发间隔是否呈现周期性(如每 30 分钟一次),有助于关联业务定时任务或批处理行为










