Java堆中垃圾回收由内存使用状态驱动,新生代Eden区满触发Minor GC,老年代剩余空间不足容纳晋升对象时触发Major GC。

新生代(Young Generation):Eden 区满即触发 Minor GC
对象优先分配在 Eden 区。当新对象要分配,而 Eden 区没有足够连续空间时,JVM 立即触发 Minor GC。
- Minor GC 会清理 Eden 和一个 Survivor 区(From),将存活对象复制到另一个 Survivor 区(To)或晋升至老年代;
- 如果 Survivor 区空间不足,或对象年龄达到阈值(默认 15 次 GC),或某年龄段对象总大小 ≥ Survivor 区一半,也会提前晋升;
- 大对象(如长数组)可能直接分配到老年代(取决于 -XX:PretenureSizeThreshold 设置),跳过新生代。
老年代(Old Generation):剩余空间不足以容纳晋升对象时触发 Major GC
Major GC(也常被称作 Full GC 的一部分)通常不是独立触发,而是由新生代 GC 过程中“晋升失败”引发。
- Minor GC 后,若大量存活对象需晋升,但老年代剩余空间
- 这种机制叫“晋升担保(Promotion Guarantee)”——JVM 会在 Minor GC 前检查老年代是否有足够空间容纳预期晋升对象,否则提前触发 Major GC;
- 老年代本身不主动“填满才回收”,而是被动响应晋升压力或显式请求。
整堆回收(Full GC):多条件叠加导致全局停顿
Full GC 回收整个堆(新生代 + 老年代 + 元空间),开销最大,应尽量避免。
- 老年代空间不足,且 Major GC 后仍无法腾出足够空间;
- 元空间(Metaspace)内存耗尽(类加载过多且未卸载,如热部署频繁、反射滥用);
- 显式调用 System.gc()(仅建议,不强制执行,但可能触发);
- CMS 收集器并发阶段失败(Concurrent Mode Failure),被迫退化为 Serial Old 全停顿回收;
- G1 或 ZGC 等现代收集器在特定场景下(如 Mixed GC 无法及时清理老年代区域)也可能升级为 Full GC。
关键细节提醒
触发点本质是内存压力信号,不是定时任务。是否真正回收、回收多少,还取决于当前使用的垃圾收集器(如 G1、ZGC、Shenandoah)及其配置策略。例如:
立即学习“Java免费学习笔记(深入)”;
- G1 通过预测模型在老年代占用率达 -XX:InitiatingOccupancyPercent 时启动并发标记,而非等空间耗尽;
- ZGC 和 Shenandoah 采用并发回收设计,大幅降低 Full GC 触发概率和停顿影响;
- 元空间默认无上限(只受本地内存限制),若未设 -XX:MaxMetaspaceSize,可能因类加载失控间接导致 Full GC。


















