# 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 停顿时间。其核心特点包括:

  1. 超低停顿(<1ms)
    采用完全并发回收,仅在极少数情况下 STW,适用于低延迟应用,如高并发服务、实时计算等。

  2. 大堆支持(最高 16TB)
    G1 受限于 32-bit 压缩指针的堆大小(最大 57GB),而 ZGC 通过染色指针(Colored Pointers)支持更大的地址空间,适合大内存应用,如 AI 训练、数据分析等。

  3. 无分代 GC
    传统 G1 采用分代 GC(年轻代 + 老年代 + Humongous),ZGC 则没有代概念,避免了跨代晋升导致的性能抖动。

  4. 染色指针 + 读屏障
    染色指针在 64 位指针的高位存储 GC 状态信息,无需额外的元数据表,减少回收开销。读屏障允许在对象访问时完成对象转移,减少 GC STW 停顿。

  5. 并发类卸载
    传统 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) 一般服务端应用(电商、广告等)

# 深入追问

  1. ZGC 如何避免 STW?

    • 采用读屏障(Load Barrier)+ 并发标记 + 并发转移,在访问对象时完成对象转移,避免 STW。
  2. 为什么 G1 不能完全避免 STW?

    • G1 仍需要 Stop-The-World 来做 Root Scanning、Mixed GC,尤其是晋升失败时可能触发 Full GC。
  3. ZGC 是否适用于所有应用?

    • ZGC 适用于低延迟应用(如金融交易、游戏服务器),但在 CPU 开销较高的场景(如大规模批处理)可能不如 G1。

# 相关面试题

  • 如何选择合适的 GC?ZGC、G1、Shenandoah 适用场景?
  • 染色指针(Colored Pointers)如何优化 GC?
  • ZGC 在大内存应用中的优势是什么?