JVM GC全流程解析:从Young GC到Full GC
回答
上图 基于JDK 1.8
GC 流程描述
-
对象分配
-
新生代分配:在 Eden 区创建对象。
-
大对象直接进老年代:
- 对象大小超过
-XX:PretenureSizeThreshold(默认0) - 或,动态年龄判定触发(某年龄对象总和 > Survivor区容量50%)
- 对象大小超过
-
-
触发 Young GC(Minor GC)
-
触发条件:
- Eden 区内存不足
- 或, Survivor 区(S0/S1)空间不足。
-
空间分配担保机制:在 Young GC 前,检查老年代剩余空间:
-
若老年代空间足够,允许执行 Young GC。
-
若老年代空间不足(老年代剩余空间 < 预估晋升对象大小),则先触发 Full GC ,再执行 Young GC。
CMS并发标记阶段失败;
或,G1混合收集阶段失败
也会触发 FullGC
-
-
-
Young GC 执行过程
-
标记-复制算法:
-
Survivor 区处理:
若 To Survivor 区空间不足,触发担保机制;
若某年龄对象总和 > Survivor区容量50%,直接晋升。
-
-
触发 Full GC
- 老年代空间不足
- 空间分配担保失败。
- CMS并发模式失败;
- G1混合收集失败;
- 手动调用
System.gc()(不推荐)。
-
老年代 GC 算法:
- CMS,在JDK 9+已被标记为废弃
- G1:划分Region优先回收垃圾最多的区域,使用三色标记法;
- ZGC:停顿时间可控(<10ms),支持大堆。
-
OOM
- Full GC 后:老年代或元空间不足时抛出 OutOfMemoryError(OOM)。