Mixed GC触发需同时满足堆总使用率≥IHOP阈值(默认45%)且并发标记周期完整结束;随后按垃圾占比、存活率、RSet状态等动态筛选老年代Region,通过STW的Evacuation阶段回收整理。

G1 的 Mixed GC 不是靠单一条件触发的,它需要两个硬性前提同时成立:堆总使用率越过 IHOP 阈值,并且并发标记周期已完整结束。
触发的两个必要条件
只看老年代用了多少,或只看堆用了多少,都不足以判断 Mixed GC 会不会来。
-
堆总占用 ≥ IHOP 阈值:默认是 45%,由
-XX:InitiatingHeapOccupancyPercent控制。注意,这是“整个堆”的使用率,不是单指老年代。比如堆总大小 8GB,用了 3.6GB(45%)才可能启动标记;若只用了 3GB(37.5%),哪怕老年代已占满,也不会触发。 -
并发标记周期必须完成:包括初始标记(Initial Mark)、并发标记(Concurrent Marking)、最终标记(Remark)和清理(Cleanup)四个阶段。只有 Cleanup 阶段输出了可回收的老年代 Region 列表,Mixed GC 才会真正开始。如果中途被取消(日志中出现
Concurrent Cycle was cancelled),哪怕堆已超阈值,也不会执行 Mixed GC。
哪些老年代 Region 会被选中回收
并发标记完成后,G1 并不会把所有老年代 Region 都拉进回收集,而是按收益动态筛选:
- 存活对象比例低于
-XX:G1MixedGCLiveThresholdPercent(默认 85%)——存活太多就跳过,避免复制开销过大; - Region 中垃圾占比高、回收价值大;
- RSet(Remembered Set)状态稳定,跨 Region 引用关系清晰;
- 综合复制成本与预期释放空间,优先选“性价比高”的 Region。
触发后的行为特点
Mixed GC 是分批执行的,不是一次收完所有候选 Region:
- 每次只回收一部分老年代 Region,配合年轻代一起处理,停顿时间受
-XX:MaxGCPauseMillis(默认 200ms)约束; - 默认最多执行 8 轮(由
-XX:G1MixedGCCountTarget控制),直到候选 Region 被清空或回收收益明显下降; - 如果连续几轮回收量极小(如每次只回收 1–2 个 Region),说明这些 Region 存活率过高,G1 会暂停 Mixed GC,等堆浪费(
G1HeapWastePercent,默认 5%)超标后再尝试,否则可能退化为 Full GC。
容易忽略的辅助触发点
除了主路径,还有两个次要但实际存在的触发信号:
- 当可回收垃圾总量超过堆的
-XX:G1HeapWastePercent(默认 5%)时,G1 可能主动启动 Mixed GC 来腾空间; - 如果老年代增长过快,而并发标记还没完成,但老年代已接近耗尽,JVM 可能提前终止标记并强制 Mixed GC,不过这种情况风险高,容易滑向 Full GC。

















