mixed gc 是 g1 实现低延迟高吞吐的核心机制,含全局并发标记(初始标记、并发标记、最终标记、清理)和混合回收执行(cset构建、回收价值筛选、evacuation转移),并依赖堆状态触发与退化。

Mixed GC 是 G1 收集器实现低延迟、高吞吐的核心机制,它不是简单叠加 Young GC 和老年代回收,而是有明确阶段划分和协同逻辑的闭环流程。
全局并发标记:Mixed GC 的前置准备
混合回收不会直接开始搬移对象,必须先完成一次完整的并发标记周期。这个周期分四步:
- 初始标记(Initial Mark):STW 阶段,但通常“搭车”在一次 Young GC 中完成。它标记 GC Roots 直接引用的对象,并顺带扫描 Survivor 区中被老年代引用的对象(依赖 RSet)。
- 并发标记(Concurrent Marking):与应用线程并行运行。基于初始标记结果,用三色标记法 + SATB(Snapshot-At-The-Beginning)算法遍历可达对象。写屏障会记录标记开始后发生的引用变更,确保不漏标活对象。
- 最终标记(Remark):短暂停顿(STW),处理 SATB Buffer 中未消费的引用变更记录,收尾标记工作,确认所有存活对象。
- 清理(Cleanup):部分 STW。统计每个 Region 的存活对象数量和垃圾占比;清空全空 Region;按“回收价值”(垃圾多、复制开销小)对老年代 Region 排序,为后续 Mixed GC 构建候选集。
混合回收执行:只回收“高性价比”的老年代区域
标记完成后,G1 并不一次性清扫全部老年代,而是分批、择优回收:
- 构建 CSet(Collection Set):包含所有待回收的 Eden/Survivor Region,再从老年代中选取一批满足条件的 Region(由
-XX:G1OldCSetRegionThresholdPercent等参数控制数量上限)。 - 回收价值筛选关键指标是 reclaimable(可回收比例):日志中
G1-Evacuation-Info显示某 Region 的 reclaimable 若低于 20%,G1 默认跳过;可通过调高-XX:G1HeapWastePercent(默认 5%)来放宽阈值。 - 执行 Evacuation(转移):对 CSet 中所有 Region 统一进行“标记-复制”,存活对象按年龄或大小规则分别晋升到 Survivor 或老年代其他 Region;原 Region 被整体清空,无内存碎片。
触发与退化机制:不是“到了就收”,而是“值得才收”
Mixed GC 的启动和持续行为高度依赖堆状态和回收效果:
- 触发条件是老年代占用率超过
-XX:InitiatingHeapOccupancyPercent(默认 45%),而非固定时间或次数。 - 若连续多次 Mixed GC 只回收极少量 Region(如每次仅 1–2 个),说明候选 Region 存活率过高(比如缓存长期驻留、大对象未释放),G1 会保守回避,直到堆浪费(
G1HeapWastePercent)超标或最终退化为 Full GC。 - Young GC 是 Mixed GC 的天然前奏——初始标记常借其 STW 完成;而 Mixed GC 执行期间,Young GC 仍可正常发生,且可能中断并发标记,之后继续。
常见卡顿点与优化线索
实际调优中,以下环节最容易暴露问题:
-
Initial Mark 卡顿:多因 RSet 未热或 Dirty Card Queue 积压。建议设置
-XX:G1ConcRefinementThreads为 CPU 核数的 1/4~1/2。 -
Mixed GC 频繁但收效低:检查
G1-Evacuation-Info日志中的 reclaimable 字段;监控老年代 Region 存活率分布,识别长生命周期对象。 -
Root Region Scan 耗时高:说明 Survivor 到老年代跨代引用多,可适当提高
-XX:G1MixedGCCountTarget分摊压力。











