G1的Mixed GC是YGC在特定条件下的自然延伸,二者共享同一机制:YGC固定回收年轻代Region,Mixed GC在此基础上加入垃圾占比高的老年代Region;Mixed GC依赖YGC触发并发标记,并基于其结果选择回收目标。

G1收集器的混合回收(Mixed GC)和年轻代回收(Young GC,YGC)本质是同一套机制下的不同阶段,不是并列的两种独立策略——YGC是基础动作,Mixed GC是YGC在特定条件下的自然延伸,二者共享核心算法、停顿特性与执行框架,区别主要体现在回收范围、触发逻辑和依赖前提上。
回收范围:从“只清年轻代”到“顺带清理老年代”
Mixed GC 和 YGC 都采用复制算法,都需 Stop-The-World,但回收的 Region 集合(CSet)不同:
- YGC 固定回收全部 Eden + Survivor Region,不碰老年代 Region;
- Mixed GC 在回收全部年轻代 Region 的基础上,额外加入若干老年代 Region——这些 Region 是并发标记阶段评估出“垃圾占比高、回收收益大”的候选者,不是随机选,也不是全量扫。
触发逻辑:YGC 是常态,Mixed GC 是有条件的接力
Mixed GC 不会单独触发,它依赖 YGC 作为入口和前置条件:
- YGC 每次执行时都会检查堆内存使用率(默认阈值 45%),若超限,则启动全局并发标记(Concurrent Marking);
- 并发标记完成后,G1 就拥有了各 Region 的存活率与回收价值数据;
- 下一次 YGC 执行后,如果满足 Mixed GC 条件(如老年代垃圾占比 ≥ G1HeapWastePercent,默认10%),就会自动升级为 Mixed GC;
- 也就是说,YGC 是“探路者”,Mixed GC 是“收获者”——没有 YGC 就没有并发标记,没有并发标记就无法选出值得回收的老年代 Region。
执行目标:从快速周转到平衡压力
两者都追求低延迟,但侧重点不同:
- YGC 目标是快速释放 Eden 空间,保障新对象分配,停顿时间短、频率高;
- Mixed GC 目标是在可控停顿内,同步缓解年轻代和老年代的内存压力,避免老年代持续膨胀最终触发 Full GC(实际是 fallback 到 Serial Old);
- 一次 Mixed GC 通常只清理部分老年代 Region,可能需多次执行才能显著降低老年代占用,而 YGC 每次都是“全量年轻代清理”。
联动关键:RSet 与并发标记是桥梁
YGC 和 Mixed GC 能协同工作的技术基础有两个:
- RSet(Remembered Set):记录跨 Region 引用(比如老年代对象引用了年轻代对象),让 YGC 不必扫描整个老年代,只需查 RSet 就能定位“脏卡”,大幅缩短根扫描时间;
- 并发标记结果:只有完成初始标记→并发标记→再标记→筛选统计这一整套流程,G1 才知道哪些老年代 Region 值得纳入 Mixed GC 的 CSet——没有这个数据支撑,Mixed GC 就无从谈起。

















