混合回收以young gc为入口,在并发标记周期完成后启动,按垃圾比例优先选取老年代region加入回收集,受停顿时间目标约束,多轮渐进执行,满足条件后终止并回归纯young gc。

混合回收触发的前提条件
混合回收不是独立启动的,它依赖并发标记周期的完成。当堆内存占用达到初始阈值(IHOP,默认45%)后,G1会启动并发标记;只有在最终标记(Remark)和清理(Cleanup)阶段结束后,G1确认了一批“垃圾比例高、回收收益大”的老年代Region,才会开始混合回收。
此时若年轻代再次触发GC,该次Young GC就会升级为Mixed GC——也就是说,混合回收总是以一次Young GC为入口,但回收范围扩展到了部分老年代Region。
回收集(CSet)的选择逻辑
G1不按代回收,而是按Region的价值回收。混合回收前,G1会基于Cleanup阶段统计的每个Old Region存活率(即垃圾占比),按从高到低排序,优先选取“单位时间回收垃圾最多”的Region组成回收集。
- 每次Mixed GC实际回收的老年代Region数量受
-XX:MaxGCPauseMillis严格约束 - 目标是单次停顿控制在设定值内,因此不会一次性回收所有可选Old Region
- 若某Old Region中存活对象过多(例如>90%),G1会跳过它,避免复制开销过大
- Humongous Region不参与常规Mixed GC,仅在Full GC或特定Cleanup中处理
执行过程与关键行为
Mixed GC仍采用STW + 复制算法,但范围覆盖Eden、Survivor及选定的Old Region:
- 根扫描阶段同时检查GC Roots和Remembered Sets(RSet),确保跨Region引用不遗漏
- 存活对象被疏散(Evacuation)到空闲Region:年龄未达阈值的进入Survivor,达阈值或空间不足则直接晋升至Old Region
- 原Region被清空并加入空闲列表,后续可重新分配为Eden/Survivor/Old角色
- 若疏散过程中发现目标Region不足(如To区已满),可能触发“疏散失败”(Evacuation Failure),严重时退化为Full GC
多轮回收与退出机制
混合回收不是一劳永逸的,而是一组连续、渐进的GC动作:
- 默认最多执行
G1MixedGCCountTarget轮(JDK8u40+默认8轮),每轮回收一部分Old Region - 每轮后重新评估剩余Old Region的垃圾比例,动态调整下一轮回收集
- 当待回收Old Region总数低于阈值(
G1HeapWastePercent,默认5%),或回收效率持续下降,G1自动终止Mixed GC序列,回归纯Young GC模式 - 若并发标记跟不上对象晋升速度,Old Region持续堆积,可能触发Full GC——这是必须规避的异常路径











