JVM GC全流程解析:从Young GC到Full GC

200 阅读1分钟

JVM GC全流程解析:从Young GC到Full GC

回答

image-20250329110007783

上图 基于JDK 1.8

GC 流程描述
  1. 对象分配

    • 新生代分配:在 Eden 区创建对象。

    • 大对象直接进老年代

      1. 对象大小超过 -XX:PretenureSizeThreshold(默认0)
      2. 或,动态年龄判定触发(某年龄对象总和 > Survivor区容量50%)
  2. 触发 Young GC(Minor GC)

    • 触发条件

      1. Eden 区内存不足
      2. 或, Survivor 区(S0/S1)空间不足。
    • 空间分配担保机制:在 Young GC 前,检查老年代剩余空间:

      1. 若老年代空间足够,允许执行 Young GC。

      2. 若老年代空间不足(老年代剩余空间 < 预估晋升对象大小),则先触发 Full GC ,再执行 Young GC。

        CMS并发标记阶段失败;

        或,G1混合收集阶段失败

        也会触发 FullGC

  3. Young GC 执行过程

  4. 触发 Full GC

    1. 老年代空间不足
    2. 空间分配担保失败。
    3. CMS并发模式失败;
    4. G1混合收集失败;
    5. 手动调用 System.gc()(不推荐)。
  5. 老年代 GC 算法

    • CMS,在JDK 9+已被标记为废弃
    • G1:划分Region优先回收垃圾最多的区域,使用三色标记法;
    • ZGC:停顿时间可控(<10ms),支持大堆。
  6. OOM

    • Full GC 后:老年代或元空间不足时抛出 OutOfMemoryError(OOM)