g1混合回收由动态机制触发,核心是堆总占用率超ihop阈值且并发标记完成;每次选region基于回收价值、停顿约束和空间压力三重权衡。

G1混合回收(Mixed GC)不是简单看“老年代满了”,而是由一套带反馈的动态控制机制决定。核心在于堆整体占用节奏、并发标记是否完成,以及每次回收前对价值、停顿和空间压力的实时权衡。
触发起点是整个堆的占用率,不是老年代单独占比
IHOP(-XX:InitiatingHeapOccupancyPercent)默认为45%,它监控的是整个堆已用内存比例,而非老年代自身占比。只有这个值被突破,G1才会启动并发标记周期;标记没完成,Mixed GC就绝不会发生。
- 堆总占用长期卡在42%,哪怕老年代已占80%,也不会进Mixed GC——因为标记根本没开始
- 对象晋升快、老年代涨得猛,但年轻代频繁回收把整体堆压在43%,同样会延迟触发
- 若业务老年代增长稳定但不可预测,可将IHOP调低(如设为40),提前启动标记,争取更多缓冲时间
必须等并发标记周期彻底结束
Mixed GC严格依赖并发标记周期的完成,该周期包含四个阶段:
- 初始标记(Initial Mark):伴随一次Young GC发生,STW极短,只标记GC Roots直连对象
- 并发标记(Concurrent Marking):后台线程并行扫描全堆,不阻塞应用,耗时最长
- 最终标记(Remark):STW,修正并发期间的引用变动(基于SATB写屏障)
- 清理(Cleanup):STW+部分并发,统计每个Region的垃圾占比与回收价值,生成候选回收集
只有Cleanup阶段结束,并确认老年代占用仍≥IHOP,G1才正式进入Mixed GC阶段。
每次回收选哪些Region,由三重动态因素实时决定
Mixed GC不一次性清空老年代,而是每次挑选一部分Region,具体数量取决于:
- 回收价值排序:优先选“垃圾占比高、RSet小、存活对象少”的Region,单位耗时收益最大
- 停顿时间兜底:以-XX:MaxGCPauseMillis为硬约束。G1在Evacuation Pause前模拟累加Region,预估STW超限时立即停止加入
- 空间压力校正:若老年代实际占用远超IHOP(例如已达65%),G1会主动放宽停顿限制,多选几个Region加速释放;反之若刚清理完只剩30%,可能跳过本轮或只选1–2个
辅助条件也可能促成触发
除主路径外,以下情况也可能推动Mixed GC发生:
- 堆中可回收垃圾总量占比超过-XX:G1HeapWastePercent(默认5%),G1会主动回收以缓解空间压力
- 仅回收存活对象比例低于-XX:G1MixedGCLiveThresholdPercent(默认85%)的Region;若某Region存活对象过多,会被跳过,避免复制开销大于收益
- 巨型对象(Humongous)无法在Young GC中处理,其回收依赖Mixed GC或Full GC,频繁分配可能间接加快Mixed GC节奏










