Shenandoah GC 深度解析
Shenandoah 是 OpenJDK 社区开发的低延迟 GC,与 ZGC 设计目标相似,但实现方式有所不同。Shenandoah 在 Java 12 随 OpenJDK 进入主线,Java 15 成为正式特性。
Shenandoah 的最大特点是:可以在不停止应用线程的情况下进行堆整理。
与 ZGC 的对比
Shenandoah 和 ZGC 都是低延迟 GC,但实现方式有重要区别:
Brooks Pointer(转发指针)
Shenandoah 使用 Brooks Pointer 来实现并发整理:
Brooks Pointer 的工作原理
写屏障
由于使用了 Brooks Pointer,Shenandoah 需要写屏障来更新转发指针:
Shenandoah 工作阶段
Shenandoah 的工作分为多个阶段:
各阶段说明
核心参数
启用 Shenandoah
常用参数
启发式算法
Shenandoah 支持多种启发式算法:
性能特点
停顿时间
Shenandoah 的停顿时间通常在毫秒级别:
吞吐量影响
Shenandoah 的读屏障和写屏障会带来一定的吞吐量损失:
与 ZGC 的选择
选 ZGC 的场景
- 需要支持超大内存(
>100GB) - 需要 Oracle JDK 或 AdoptOpenJDK
- 需要更好的 GC 吞吐量
选 Shenandoah 的场景
- 使用 OpenJDK
- 需要社区支持
- 需要更灵活的启发式配置
配置示例
低延迟配置
低内存占用配置
已知限制
- 不支持指针压缩:与 ZGC 相同
- 不支持类数据共享:与 ZGC 相同
- 实验性特性:虽然已正式发布,但仍是较新的 GC
- 社区维护:相比 ZGC(Oracle 支持),Shenandoah 主要由社区维护