G1 垃圾回收算法详解
目录
-
简介
-
G1 GC 的设计目标
-
内存结构
-
回收过程
- 初始标记(Initial Mark)
- 并发标记(Concurrent Mark)
- 最终标记(Final Mark / Remark)
- 筛选回收(Cleanup / Evacuation)
-
混合回收(Mixed GC)
-
与其他 GC 的比较
-
优缺点
-
调优建议
-
总结
简介
G1(Garbage-First)是一种服务于 多核、大内存、低延迟 应用场景的 服务器端垃圾收集器,自 JDK 9 起成为默认 GC。其主要目标是以可预测的停顿时间来实现高吞吐量。
G1 GC 的设计目标
- 可预测的 GC 停顿时间(如
<200ms
) - 减少 Full GC 的频率
- 高吞吐量与低延迟的平衡
- 并行与并发执行,提高 CPU 利用率
内存结构
G1 GC 将堆划分为多个等大小的 Region(区域),每个 Region 大小为 1MB 到 32MB(默认 4MB),总数不超过 2048。
- 年轻代(Young Generation):包含 Eden 和 Survivor 区域,分布在多个 Region 中
- 老年代(Old Generation):由存活对象多次晋升后形成
- Humongous Region:用于存放大对象(大于一个 Region 的一半)
+------------------------------------------------------+
| Java Heap |
| +-----------+ +-----------+ +-----------+ |
| | Eden | | Survivor | | Old Gen | ... |
| | Region | | Region | | Region | |
| +-----------+ +-----------+ +-----------+ |
+------------------------------------------------------+
回收过程
G1 的 GC 过程主要分为以下阶段:
初始标记(Initial Mark)
- 标记从 GC Roots 可达的对象
- 只处理 Eden 区中的新对象引用
- 与 Minor GC 一起发生(STW)
并发标记(Concurrent Mark)
- 并发执行,不会暂停应用线程
- 遍历整个堆中的对象图,识别存活对象
- 构建每个 Region 的存活率统计信息
最终标记(Final Mark / Remark)
- STW 阶段
- 补充并发标记过程中遗漏的变更
- 采用 SATB(Snapshot-At-The-Beginning)写屏障
筛选回收(Cleanup / Evacuation)
- 选出回收价值高的 Region 进行回收(依据回收成本与收益)
- 将存活对象移动(Evacuation)到其他 Region
- 回收原 Region,形成空 Region
混合回收(Mixed GC)
在 Full GC 之前,G1 会执行 Mixed GC:
- 回收部分 Old Region + 所有 Young Region
- 并非一次完成,分多次 Mixed GC 执行,降低单次停顿时间
- 策略性选择回收的 Old Region
与其他 GC 的比较
特性 | CMS | G1 GC | ZGC/ Shenandoah |
---|---|---|---|
并发标记 | 有 | 有 | 有 |
并发清理 | 有 | 有(只处理部分 Region) | 有 |
Region 化 | 否(分代) | 是(统一 Region) | 是 |
停顿时间 | 不可预测 | 可预测 | 极低停顿 |
吞吐量 | 高 | 高 | 中 |
优化目标 | 响应性 | 响应性 + 吞吐量 | 极低延迟 |
优缺点
优点
- 可预测的 GC 停顿时间
- 更高的并发度与吞吐量
- 减少 Full GC 发生频率
- 自动调整回收策略
缺点
- 配置复杂度略高
- 对大对象的处理仍不理想(Humongous Objects)
- 初期占用 CPU 多,可能影响响应性
调优建议
-
设置最大停顿时间目标:
-XX:MaxGCPauseMillis=200
-
启用 G1 GC:
-XX:+UseG1GC
-
控制堆内存大小:
-Xms4g -Xmx4g
-
限制 Humongous 对象产生,使用对象池
-
监控指标:
gc.pause
gc.alloc.rate
gc.live.data.size
gc.heap.size
总结
G1 GC 是一款结合了 吞吐量、低延迟、可预测停顿 特性的现代垃圾回收器,非常适合服务端、大型 Java 应用。它通过 Region 化设计、分阶段回收与混合策略,达成了响应性和高效性的平衡。
在对 GC 行为有更高可控需求的场景下,G1 是比 CMS 更优秀的选择。