g1垃圾回收器的底层核心工作阶段是年轻代回收、并发标记和混合回收。年轻代回收最频繁,stw下复制存活对象并更新记忆集;并发标记在老年代使用率超阈值时启动,基于satb快照与写屏障并发标记;混合回收则同时清理年轻代和高垃圾比的老年代region,按收益排序构建cset以满足停顿目标。

G1垃圾回收器的底层核心工作阶段是年轻代回收(Young GC)、并发标记(Concurrent Marking)和混合回收(Mixed GC)。这三个阶段构成G1日常运行的主干流程,各自承担明确职责,协同实现低停顿、高预测性的内存管理。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
年轻代回收(Young GC)
这是最频繁触发的阶段,发生在Eden区满或Survivor区无法容纳晋升对象时。
- G1将堆划分为多个大小相等的Region,其中一部分动态标记为Eden、Survivor区域;
- 回收时暂停应用线程(STW),使用复制算法将存活对象从Eden/Survivor复制到新的Survivor或老年代Region;
- 同时更新记忆集(Remembered Set),记录跨Region引用,避免扫描整个堆;
- 每次回收会统计各Region的耗时与回收收益,为后续调度提供数据支撑。
并发标记(Concurrent Marking)
当老年代使用率超过初始阈值(默认45%)时启动,大部分工作与用户线程并发执行。
- 以SATB(Snapshot-At-The-Beginning)快照机制为基础,在标记开始时记录堆状态;
- 利用写屏障(Write Barrier)捕获标记期间发生的引用变更,防止漏标;
- 标记过程包括初始标记(STW,仅扫描GC Roots直接可达对象)、并发标记、最终标记(STW,处理SATB缓冲区)三个子步;
- 最终产出每个Region的存活对象比例,用于评估回收价值。
混合回收(Mixed GC)
在并发标记完成后启动,是G1区别于其他收集器的关键能力。
- 不再只清理年轻代,而是同时回收部分年轻代Region + 部分已标记为“垃圾密集”的老年代Region;
- G1按回收收益(即预期释放空间量)排序Region,优先选择“垃圾最多、代价最小”的Region组成CSet(Collection Set);
- 仍采用复制算法整理内存,消除碎片;
- 每次混合回收都受
-XX:MaxGCPauseMillis约束,自动调节CSet大小以满足停顿目标。
这三个阶段不是孤立运行,而是形成闭环:Young GC持续填充老年代 → 触发Concurrent Marking → 生成回收优先级 → Mixed GC落地清理 → 循环往复。极端情况下若Mixed GC跟不上对象晋升速度,会退化为单线程Full GC,但G1的设计目标正是尽量避免这种情况。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










