Skip to content
困难

一句话答案

ZGC 是低延迟 GC,停顿 <10ms 且不随堆增大而增加,核心技术:着色指针 + 读屏障,JDK15 生产就绪。

核心要点

ZGC(Z Garbage Collector):

  • JDK 11 实验性引入,JDK 15 正式支持
  • 目标:停顿时间 < 10ms,且与堆大小无关(无论 8GB 还是 8TB)

核心技术1:染色指针(Colored Pointers)

普通指针:[0...0][地址](64位,低46位存地址)
ZGC指针: [标记位][地址](利用64位指针的高位存元数据)

标记位(4位):
  Finalizable  | Remapped | Marked1 | Marked0
  是否进入finalize | 是否重映射 | GC标记位  | GC标记位
  • 直接在指针上存储 GC 状态信息,不需要额外的位图(Bitmap)
  • 好处:GC 状态读取不需要访问对象头,更快

核心技术2:读屏障(Load Barrier)

  • 每次读取引用时(Load),JVM 插入一小段检查代码
  • 检查指针的染色位,如果发现对象已被移动,立刻更新引用(Self-Healing)
  • 好处:GC 可以在并发阶段移动对象,不需要 STW 全量更新引用
  • 代价:每次读引用有轻微额外开销(通常 < 5%)

ZGC 的工作流程(几乎全并发):

初始标记  → STW(极短,< 1ms)
并发标记  → 与用户线程并发
再标记    → STW(极短)
并发转移准备 → 并发
初始转移  → STW(极短)
并发转移  → 与用户线程并发(移动对象,读屏障保证安全)

ZGC 适用场景: 超大堆(数十GB~TB),对延迟极度敏感(金融交易、实时系统)

追问与易错

追问方向:

  • ZGC 怎么做到停顿 <10ms?
  • ZGC 和 G1 怎么选?
  • ZGC 有什么缺点?

易错点:

  • ❌ ZGC 完全没有 STW——初始标记仍有极短 STW
  • ❌ 所有场景都用 ZGC——小堆 G1 可能更合适

💡 记忆锚点

ZGC的绝招:在指针上染色(高位存GC状态),每次读引用时读屏障自动修正(对象搬家后引用自愈)。停顿<10ms且不随堆增大——8GB和8TB一样快。代价是读操作多一道检查(约5%开销),适合超大堆+低延迟场景。