# 39. Java 21 新增的 ZGC 有什么特点?如何与 G1 进行对比?
# 标准答案
Java 21 的 ZGC(Z Garbage Collector)是一种低延迟垃圾回收器,具备超低停顿(典型停顿时间 <1ms)、大堆支持(最高 16TB)、并发回收等特点。相比 G1,ZGC 采用无分代设计(Region-less)、基于染色指针(Colored Pointers)实现读屏障(Load Barrier),能够在并发回收的同时避免长时间 Stop-The-World(STW)。它适用于低延迟、高吞吐的应用场景,如在线交易、高频金融计算等。
# 答案解析
ZGC 主要解决传统 GC(如 G1)的高停顿问题,最大化吞吐的同时降低 STW 停顿时间。其核心特点包括:
超低停顿(<1ms)
采用完全并发回收,仅在极少数情况下 STW,适用于低延迟应用,如高并发服务、实时计算等。大堆支持(最高 16TB)
G1 受限于 32-bit 压缩指针的堆大小(最大 57GB),而 ZGC 通过染色指针(Colored Pointers)支持更大的地址空间,适合大内存应用,如 AI 训练、数据分析等。无分代 GC
传统 G1 采用分代 GC(年轻代 + 老年代 + Humongous),ZGC 则没有代概念,避免了跨代晋升导致的性能抖动。染色指针 + 读屏障
染色指针在 64 位指针的高位存储 GC 状态信息,无需额外的元数据表,减少回收开销。读屏障允许在对象访问时完成对象转移,减少 GC STW 停顿。并发类卸载
传统 GC 在 Full GC 时才能卸载无用类,ZGC 允许并发卸载,避免 Metaspace OOM 问题,适合动态加载 Class 的应用(如 Web 服务器)。
ZGC 和 G1 的主要区别如下:
对比项 | ZGC | G1 GC |
---|---|---|
STW 停顿时间 | <1ms | 10ms~100ms |
分代机制 | 无分代(Region-less) | 有分代(Young + Old + Humongous) |
回收方式 | 99% 并发回收 | 部分并发,部分 STW |
指针管理 | 染色指针(Colored Pointers) | 传统指针 |
最大支持堆 | 16TB | 57GB(压缩指针模式下) |
Full GC | 极少发生 | 可能频繁发生 |
适用场景 | 低延迟、大内存应用(金融、AI) | 一般服务端应用(电商、广告等) |
# 深入追问
ZGC 如何避免 STW?
- 采用读屏障(Load Barrier)+ 并发标记 + 并发转移,在访问对象时完成对象转移,避免 STW。
为什么 G1 不能完全避免 STW?
- G1 仍需要 Stop-The-World 来做 Root Scanning、Mixed GC,尤其是晋升失败时可能触发 Full GC。
ZGC 是否适用于所有应用?
- ZGC 适用于低延迟应用(如金融交易、游戏服务器),但在 CPU 开销较高的场景(如大规模批处理)可能不如 G1。
# 相关面试题
- 如何选择合适的 GC?ZGC、G1、Shenandoah 适用场景?
- 染色指针(Colored Pointers)如何优化 GC?
- ZGC 在大内存应用中的优势是什么?