Shenandoah GC

候选人小王在面试字节 P6 时,面试官问道:

"Shenandoah GC 是什么?它和 ZGC 有什么区别?"

小王说:"Shenandoah 是低停顿 GC..."面试官追问:"Shenandoah 的 Brooks Pointer 是什么?"

小王答不上来...

一、核心问题:Shenandoah GC 🟡

1.1 标准回答

P5 级别:与 ZGC 的对比

Shenandoah vs ZGC

维度ShenandoahZGC
开发者Red Hat(OpenJDK 社区)Oracle(JDK)
引入版本JDK 12(experimental)JDK 11(experimental)
停顿时间< 1ms< 1ms
颜色存储对象头(Brooks Pointer)指针(Colored Pointers)
写屏障双重屏障(读+写)读屏障

P6 级别:Brooks Pointer

Brooks Pointer(Brooks 指针)

Shenandoah 在每个对象头中添加一个转发指针

对象头
├─ Mark Word(8 字节)
└─ Brooks Pointer(8 字节)← 额外添加

转发指针指向对象的新地址,实现并发压缩:

// 对象移动时
对象 A(地址 0x1000) → 复制到新地址 0x5000
Brooks Pointer(0x1000)→ 指向新地址 0x5000

// 读屏障检查
if (brooksPointer != address) {
    // 对象已移动,更新引用
}

Brooks Pointer 的代价

  • 每个对象额外增加 8 字节开销
  • 双重屏障(读+写)增加屏障开销

【面试官心理】 这道题我能问到 P7 级别,是因为 Shenandoah 和 ZGC 代表了两种不同的低停顿 GC 设计路线。能说清 Brooks Pointer 和 Colored Pointers 差异的候选人说明他理解了 GC 技术的多样性。

二、生产使用 🟢

2.1 Shenandoah 配置

# 启用 Shenandoah
-XX:+UseShenandoahGC

# 停顿时间目标
-XX:MaxGCPauseMillis=200
💡

面试加分点:能说出"JDK 21 中,Shenandoah 成为正式特性(GA),不再需要 experimental 标志",说明他关注了 JDK 21 的新特性。

⚠️

面试陷阱:被问到"Shenandoah 的读屏障比 ZGC 的读屏障开销更大吗",很多人会说"是的"。准确答案是:,因为 Shenandoah 需要同时处理读屏障(检查 Brooks Pointer)和写屏障(更新 Brooks Pointer),而 ZGC 只需要读屏障验证颜色。但两者都是亚毫秒级别的停顿。