mixed gc 启动需同时满足堆总使用率≥ihop阈值且并发标记周期已完成;回收时动态筛选垃圾占比高、复制成本低的老年代region;执行为stw,含初始标记、evacuation和remembered set更新。

Mixed GC 不是单靠某个百分比就自动启动的,它需要两个硬性条件同时满足:堆总使用率越过 IHOP 阈值,并且并发标记周期已完整走完。
触发 Mixed GC 的两个必要前提
只看老年代用了多少,或者只看堆用了多少,都不够。必须同时满足:
- 堆内存总使用率 ≥ -XX:InitiatingHeapOccupancyPercent(默认 45%),这是启动并发标记周期的开关;
- 并发标记周期已全部完成——包括初始标记、并发标记、最终标记和清理阶段,且清理阶段已产出可回收的老年代 Region 列表。
比如:堆已用 50%,但并发标记中途被取消(日志里出现 Concurrent Cycle was cancelled),Mixed GC 就不会来;反过来,老年代占了 80%,但总堆才用 40%,根本没触发标记,也不会启动 Mixed GC。
哪些老年代 Region 会被选中回收
G1 不会一股脑扫所有老年代 Region,而是从并发标记产出的候选集中,按“值不值得”动态筛选:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 跳过不能收的:存活对象比例超过 -XX:G1MixedGCLiveThresholdPercent(默认 85%)、巨型对象(Humongous)Region、Remembered Set 还没准备好的 Region;
- 优先选“收益高”的:垃圾占比高、复制成本低的 Region,也就是腾空间多、搬对象快的;
- 受三重调节影响:历史回收误差、当前老年代剩余空闲 Region 数量、本轮 Mixed GC 的轮数目标(默认最多 8 轮,由 -XX:G1MixedGCCountTarget 控制)共同决定本次收多少个。
Mixed GC 的实际执行流程
Mixed GC 是一次 Stop-The-World 操作,但全程控制在 -XX:MaxGCPauseMillis 设定的停顿目标内。主要步骤包括:
- 初始标记(STW):标记 GC Roots 直接可达对象,并扫描 Survivor 区引用的老年代对象(Root Region Scanning);
- Evacuation 阶段(STW):同时回收全部 Eden Region、部分 Survivor Region 和选定的老年代 Region;存活对象按年龄和空间情况复制到新的 Survivor 或老年代 Region;
- Remembered Set 更新:同步更新跨 Region 引用记录,确保下次 GC 能准确定位引用关系。
注意:并发标记本身是非 STW 的,且已在前一轮完成,Mixed GC 中不再重复执行。
容易被忽略的辅助触发因素
除了主路径外,还有两类情况可能促成 Mixed GC 启动:
- 当堆中可回收的垃圾总量占比超过 -XX:G1HeapWastePercent(默认 5%)时,G1 可能主动触发 Mixed GC 来释放空间;
- 如果某次 Young GC 发生时,恰好并发标记已完成、堆占用也越过了 IHOP,那这次 Young GC 就会直接升级为 Mixed GC,日志里会显示 [GC pause (G1 Evacuation Pause) (mixed)]。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










