资讯动态

深入理解 G1 Mixed GC:触发条件、完整流程与高频误区

发布时间:2026/10/15 3:26:50 来源:尧图企业网站定制
G1 收集器是目前 Java 服务端主流的分代收集器之一它最大的特点是将堆划分为多个 Region并通过Young GC、Mixed GC、Full GC三种回收动作配合工作。其中Mixed GC是 G1 独有的回收机制也是很多同学容易混淆的知识点。本文将从定义、触发条件、完整流程、是否一定执行、与 Young GC/Full GC 的区别等角度系统梳理 G1 Mixed GC 的核心逻辑。一、什么是 G1 Mixed GC1.1 定义Mixed GC是 G1 收集器独有的回收动作Parallel / CMS 等收集器均没有该概念。它的核心作用是分批回收老年代垃圾尽量降低 Full GC 发生的概率。1.2 回收范围Mixed GC 的回收范围包括整个新生代Eden Survivor部分老年代 Region只挑选垃圾占比最高、回收收益最大的一批老年代 Region需要特别强调Mixed GC不会回收全部老年代每次只回收一部分 Region。虽然它同时回收新生代但新生代回收本身普通 Young GC 就能完成Mixed GC 的出发点是解决老年代垃圾堆积问题。1.3 算法与停顿算法复制算法停顿全程 STW但通常比 Full GC 停顿时间短得多二、触发前提必须先完成一整套并发标记周期很多同学误以为“老年代达到 45% 就会触发 Mixed GC”其实这是不准确的。2.1 IHO 阈值的作用G1 通过参数-XX:InitiatingHeapOccupancyPercent简称IHO默认值为45%。它的含义是当老年代占用达到整个堆的 45% 时触发并发标记周期而不是直接触发 Mixed GC。检测时机通常发生在Young GC 的 STW 阶段内Eden 满触发 Young GCYoung GC 回收完新生代后在 STW 尚未释放时检测老年代占用如果老年代占用超过 IHO 阈值则启动并发标记周期如果未超过阈值则只完成普通 Young GC不启动标记周期。因此IHO 阈值是并发标记周期的开关并不是 Mixed GC 的开关只有完整跑完并发标记周期才可能执行 Mixed GC。2.2 未达阈值的情况如果老年代占用始终低于 IHO 阈值只反复执行普通 Young GC不会启动并发标记周期老年代垃圾不会被扫描也不会被回收自然也不会有 Mixed GC。三、完整并发标记周期时序当老年代占用达到 IHO 阈值后G1 会启动一整套并发标记周期主要包括以下 4 个阶段3.1 初始标记Initial MarkSTW初始标记会挂靠在一次 Young GC 的 STW 上。过程Eden 满触发 Young GCYoung GC 回收新生代在同一个 STW 中检查老年代占用超过阈值执行初始标记标记 GC Roots 直接可达对象STW 结束。注意绝大多数 Young GC 不会执行初始标记。只有老年代达到阈值的那一次 Young GC才会复用其 STW 执行初始标记。3.2 并发标记Concurrent Mark无 STW并发标记阶段GC 后台线程与业务线程并行执行遍历堆对象图做三色标记识别老年代存活对象与垃圾对象。重点并发标记可以被 Young GC 打断Eden 一旦满就会触发 STW 的 Young GC并发标记线程暂停Young GC 执行完毕后并发标记线程从断点继续执行使用SATBSnapshot At The Beginning原始快照写屏障记录 Young GC 复制、晋升带来的对象变动防止漏标。3.3 最终标记RemarkSTW最终标记阶段会处理 SATB 队列、RSet 记忆集等修补并发标记期间包括中途穿插的 Young GC 产生的全部漏标。完成后整个堆所有对象的存活状态基本标记完成。3.4 筛选回收Mixed GCSTW基于前面标记得到的老年代 Region 垃圾统计信息挑选回收收益最高的一批老年代 Region连同当前已经被业务重新填满的新生代一起复制回收。关键点当初开启标记周期的那次 Young GC 已经清空了新生代但在并发标记和 Remark 期间业务线程持续创建对象Eden 又会被重新填满。因此 Mixed GC 必须同时处理新生代。完整时序可简化为Eden 满↓Young GC清理新生代↓ 检测老年代超过 IHO├── 否 → 普通 Young GC 结束不启动并发标记└── 是 → 同一个 STW 执行初始标记↓并发标记可被多次 Young GC 打断↓Remark 最终标记↓Mixed GC回收新生代 部分老年代 Region四、Mixed GC 一定执行吗两种结局即使老年代达到 IHO 阈值启动了并发标记周期Mixed GC 也不一定 100% 执行。4.1 正常流程成功执行 Mixed GC如果标记周期顺利完成G1 会根据标记结果分批执行 Mixed GC每次 Mixed GC 回收一部分老年代 Region释放内存老年代占用下降后续对象继续晋升老年代再次达到 IHO 阈值开启新一轮标记周期再次执行 Mixed GC。这样循环往复尽量不发生 Full GC。一次标记周期结束后通常会触发多次 Mixed GC每次只回收一部分老年代 Region逐步释放空间。4.2 Mixed GC 不会执行的两个场景场景 1老年代占用始终低于 IHO 阈值不启动并发标记周期只会反复执行普通 Young GC老年代垃圾不会被清理不会执行 Mixed GC。场景 2对象晋升速度过快老年代提前耗尽已经启动并发标记周期但并发标记还未完成或 Mixed GC 还没机会执行大量对象晋升老年代 Region 被耗尽直接退化触发Full GCMixed GC 被跳过。通俗理解IHO 45% 相当于警戒线。老年代到 45%拉起“垃圾清点小组”即并发标记周期清点哪些老年代 Region 垃圾多。清点全部结束后才安排分批打扫即 Mixed GC。如果还没清点完房间直接堆满了就只能全屋大扫除即 Full GC分批打扫就不做了。房间没到警戒线清点小组根本不会上班。五、Young GC / Mixed GC / Full GC 对比GC 类型STW回收范围触发条件核心特点Young GC✅ STW仅新生代 Eden SurvivorEden 占满复制算法只清理新生代对象晋升老年代不回收老年代垃圾可以打断并发标记Mixed GC✅ STW新生代 部分老年代 Region完整并发标记周期结束后G1 独有分批清理老年代用于规避 Full GC不会回收全部老年代Full GC✅ 长时间 STW新生代 老年代 元空间全部老年代内存耗尽最坏兜底通常单线程整理生产环境极力避免六、高频误区与坑点误区 1Mixed GC 会紧跟在触发标记的那次 Young GC 之后立即执行错误。Mixed GC 不会马上执行。在初始标记之后还要经历并发标记、Remark期间可能发生多次普通 Young GC。只有完整标记周期结束后才会执行 Mixed GC。误区 2并发标记期间不能发生 Young GC错误。Young GC 优先级更高可以打断并发标记。并发标记线程会被暂停Young GC 执行完后从断点继续。G1 通过 SATB 写屏障保证标记正确性。误区 3Mixed GC 只回收老年代错误。Mixed GC 必须同时回收新生代。因为并发标记和 Remark 期间业务线程不断产生新对象Eden 会被重新填满。所以 Mixed GC 的回收范围是新生代 部分老年代 Region。误区 4Mixed GC 会一次性清空全部老年代错误。Mixed GC 每次只回收一部分老年代 Region通常需要多次 Mixed GC 才能逐步释放老年代空间。这也是 G1 能够控制停顿时间的关键设计之一。七、总结G1 Mixed GC 的核心逻辑可以概括为以下几点Mixed GC 是 G1 独有用于分批回收老年代避免 Full GC。IHO 阈值默认 45%是并发标记周期的开关不是 Mixed GC 的开关。只有完整跑完初始标记 → 并发标记 → Remark才可能执行 Mixed GC。并发标记可以被 Young GC 打断SATB 保证不漏标。Mixed GC 回收新生代 部分老年代 Region不是全部老年代。若对象晋升速度过快老年代耗尽会直接 Full GC跳过 Mixed GC。理解这些逻辑就能准确回答 G1 Mixed GC 的触发条件、执行流程以及常见误区。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑