外观
一句话答案
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%开销),适合超大堆+低延迟场景。