本文目录#

背景#

Shenandoah 初版为单代回收,JDK 21 引入代际 Shenandoah(JEP 404)以提升吞吐。通过将堆分为年轻代和老年代,减少全堆并发标记成本。

特性#

  • 新生代采用并发复制;
  • 老年代继续使用并发标记 + 压缩;
  • 支持动态晋升、Remembered Set;
  • 与 ZGC 相比仍保留 Brookes Pointer 机制。

启用与参数#

  • -XX:+UseShenandoahGC -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC(JDK 21 及以上);
  • -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCMode=generational
  • 调整 -XX:ShenandoahGenerationalGCInterval 控制代际周期。

监控指标#

  • ShenandoahGenerationalCycles
  • 新生代停顿 Pause Young
  • 老年代并发时间 Concurrent Mark
  • Humongous Region 使用率。

调优建议#

  • 适合中大型堆并希望兼顾吞吐与延迟;
  • 配合 -Xlog:gc*,gc+heap=info 分析代际占比;
  • 关注 Degenerated GC,优化对象分配速率;
  • 根据业务场景选择 G1/ZGC/Shenandoah 的取舍。

自检清单#

  • 是否使用支持代际 Shenandoah 的 JDK 版本?
  • 是否评估与单代 Shenandoah 或 ZGC 的指标差异?
  • 是否在监控平台上新增相关指标与告警?

参考资料#


本作品系原创,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请注明出处。