Skip to content

JEP 474: ZGC: Generational Mode by Default | ZGC:默认采用世代模式

摘要

将 Z 垃圾收集器(ZGC)的默认模式切换到分代模式。弃用非分代模式,并计划在未来的版本中移除它。

目标

  • 表明未来开发将专注于分代 ZGC。
  • 降低支持两种不同模式的维护成本。

非目标

  • 目标不是从目标发布中移除非分代 ZGC。

动机

维护非分代 ZGC 会减缓新功能的开发。正如 JEP 439: 分代 ZGC 所述:

对于大多数用例而言,分代 ZGC 应该是比非分代 ZGC 更好的解决方案。我们最终应该能够用前者替换后者,以降低长期维护成本。

描述

通过将 ZGenerational 选项的默认值从 false 更改为 true,使分代 ZGC 成为 ZGC 的默认模式。通过弃用 ZGenerational 选项来弃用非分代模式。

进行这些更改后,将根据提供的命令行参数观察到以下行为:

  • -XX:+UseZGC

    • 使用分代 ZGC。
  • -XX:+UseZGC -XX:+ZGenerational

    • 使用分代 ZGC。
    • 发出 ZGenerational 选项已弃用的警告。
  • -XX:+UseZGC -XX:-ZGenerational

    • 使用非分代 ZGC。
    • 发出 ZGenerational 选项已弃用的警告。
    • 发出非分代模式已弃用并计划移除的警告。

切换到分代 ZGC 的工作负载可能会在日志输出以及从可服务性和管理 API 获得的数据中体验到差异。

测试

我们将确保现有的测试不受弃用选项警告的影响,并且在与更改前相同的配置下通过测试。

风险和假设

此 JEP 的风险和假设与 JEP 439: 分代 ZGC 相同。

分代 ZGC 的性能将与非分代 ZGC 不同。这带来的主要风险是,一些工作负载本质上是非分代的,因此可能会看到轻微的性能下降。我们认为,这类工作负载的数量足够小,不足以证明长期维护两个不同版本的 ZGC 的成本是合理的。

具体风险包括:

  • 用户可能需要调整针对非分代 ZGC 优化的配置。
  • 弃用警告消息可能会引起问题。
  • 与 JVM 内部、GC 日志以及通过管理接口获得的数据紧密耦合的工作负载可能需要额外关注。