Java 深入浅出垃圾回收【二、G1 GC / ZGC / Shenandoah GC】
现代 GC 流程核心对比

1. G1 GC(Garbage First)
1.1 核心思想
- 将堆划分为 多个大小相等的 Region(默认 1–32 MB),不再是固定的年轻代/老年代
- 年轻代和老年代都是 Region,通过 RegionSet 动态划分
- 混合回收 (Mixed GC):年轻代 + 部分老年代 Region 同时回收
- 目标:可预测停顿时间,控制 STW 时间
1.2 内存结构(源码)
Heap
├─ Eden Regions
├─ Survivor Regions
├─ Old Regions
└─ Humongous Regions (>1/2 Region size)
源码类关键:
G1CollectedHeap:G1 GC 堆入口G1YoungGen/G1OldGen:年轻代/老年代管理G1Region:Region 对象G1Collector:主要收集器
1.3 回收流程
1.3.1 Minor GC(年轻代回收)
-
Eden/S0/S1 对象复制
- 使用 复制算法,存活对象复制到 Survivor 或晋升到老年代
-
Region 空闲计算
- 计算哪些 Region 可以回收
-
STW 阶段
- 暂停应用线程,执行初始标记(Root 标记)
1.3.2 Mixed GC(年轻代 + 老年代)
-
选择回收 Region
- 优先回收垃圾最多的 Region
- 使用 Region 回收优先队列
-
并发标记阶段
- 遍历可达对象,标记存活对象
- STW 初始标记 + 并发标记 + STW 重新标记
-
整理/搬迁
- 将存活对象移动到其他 Region
- 更新引用(Forwarding Table / Remembered Set)
1.3.3 Humongous Objects
-
对象大于 1/2 Region → 分配到连续 Humongous Region
-
处理方式:
- Minor GC 可能直接晋升到老年代
- Mixed GC 时单独回收
1.4 源码关键细节
-
对象移动:
HeapRegion::evacuate()负责对象搬迁- 通过 forwarding pointer 更新引用
-
并发标记:
G1ConcurrentMark::mark_roots()遍历根对象G1ConcurrentMark::concurrent_mark()并发扫描
-
STW 控制:
-XX:MaxGCPauseMillis:目标停顿时间G1CollectorPolicy::select_regions_to_collect()
2. ZGC(Z Garbage Collector)
2.1 核心思想
-
超低延迟 (<10ms)
-
并发、增量式
-
支持 TB 级大堆
-
核心技术:
- Colored Pointers:对象头 + 指针编码状态
- Load Barriers:对象访问时更新引用
- Region + Relocation:并发移动对象
2.2 内存结构
-
Region 化堆:1GB-4GB 大小,按需回收
-
虚拟空间映射 (Virtual Memory Arena):支持大堆
-
对象状态标记:
- Blue, Green, Red 等色标识对象是否移动
2.3 回收流程(源码分析)
-
并发标记
ZMarkTask遍历根对象- 使用 colored pointer 标记对象状态
-
并发准备搬迁
- 计算新地址
- 设置 forwarding pointer
-
对象搬迁
ZRelocate并发搬迁存活对象- Load Barrier 确保线程访问到新地址
-
清理空闲 Region
- 并发清理空闲内存
2.4 源码关键点
HeapRegion:ZGC 对 Region 管理ZPageList:空闲页面管理ZBarrierSet:Load / Store BarrierZRelocateTask:对象搬迁并更新指针
3. Shenandoah GC
3.1 核心思想
- 并发标记 + 并发整理
- 低停顿 (<10ms),目标大堆和延迟敏感应用
- 支持 记忆集合 (Remembered Set),追踪跨 Region 引用
3.2 内存结构
Heap
├─ Eden Regions
├─ Survivor Regions
├─ Old Regions
└─ Humongous Regions
- 与 G1 类似,但 并发整理 替代 G1 的 STW 整理
3.3 回收流程
-
初始标记 (STW)
- 标记根对象
-
并发标记
- 并行扫描对象
-
重新标记 (STW)
- 修正并发期间新创建或修改的对象
-
并发整理
ShenandoahEvacuation并发搬迁存活对象- 更新引用
-
Release 空闲 Region
- 空闲内存返回 OS
3.4 源码关键点
ShenandoahHeap:堆入口ShenandoahEvacuationSet:管理搬迁区域ShenandoahBarrierSet:Load/Store BarrierShenandoahConcurrentMark:并发标记
4. 对比分析(G1 vs ZGC vs Shenandoah)
| 特性 | G1 | ZGC | Shenandoah |
|---|---|---|---|
| 停顿时间 | 可控 (~10-200ms) | <10ms | <10ms |
| 堆大小 | Up to 32TB | TB 级 | TB 级 |
| 对象搬迁 | 并发 + STW | 完全并发 | 完全并发 |
| 算法核心 | Region + Mixed GC | Colored pointer + Load Barrier | Concurrent Compact + Barrier |
| 优点 | 自动碎片整理,调优灵活 | 超低延迟,大堆支持 | 低停顿,适合延迟敏感应用 |
| 缺点 | CPU 占用高,参数多 | 内存开销大,Barrier成本 | 调优复杂,Barrier成本 |

对象生命周期 + GC 流程可视化图
- 同时对比 G1 / ZGC / Shenandoah 的 对象流转、Barrier 介入点、并发阶段、STW 时机。
![在这里插入图片描述]()
5. 调优 & 相关 JVM 参数
G1
-XX:+UseG1GC
-XX:MaxGCPauseMillis=50
-XX:ParallelGCThreads=8
-XX:G1HeapRegionSize=16M
ZGC
-XX:+UseZGC
-XX:MaxHeapSize=512G
-XX:+UnlockExperimentalVMOptions
Shenandoah
-XX:+UseShenandoahGC
-XX:ShenandoahGCHeuristics=adaptive
-XX:ShenandoahPauses=5
本文来自博客园,作者:NeoLshu,转载请注明原文链接:https://www.cnblogs.com/neolshu/p/19120705


浙公网安备 33010602011771号