JEP 474:ZGC:默认的分代模式
总结
将 Z 垃圾收集器 (ZGC) 的默认模式切换为分代模式。弃用非分代模式,并计划在未来版本中将其移除。
目标
-
表明未来的开发将专注于 Generational ZGC 的意图。
-
降低支持两种不同模式的维护成本。
非目标
- 移除非分代 ZGC 并非目标发布版的目标。
动机
维护非分代 ZGC 会减缓新功能的开发。正如 JEP 439: Generational ZGC 中所述:
对于大多数使用场景,分代 ZGC 应该是比非分代 ZGC 更好的解决方案。为了降低长期维护成本,我们应该最终能够用前者取代后者。
描述
通过将 ZGenerational
选项的默认值从 false
改为 true
,使分代 ZGC 成为 ZGC 的默认模式。通过弃用 ZGenerational
选项来弃用非分代模式。
在这些更改之后,将根据所提供的命令行参数观察到以下行为:
-
-XX:+UseZGC
- 使用的是分代 ZGC。
-
-XX:+UseZGC -XX:+ZGenerational
- 使用的是分代 ZGC。
- 会发出
ZGenerational
选项已被弃用的警告。
-
-XX:+UseZGC -XX:-ZGenerational
- 使用的是非分代 ZGC。
- 会发出
ZGenerational
选项已被弃用的警告。 - 会发出非分代模式已被弃用并计划移除的警告。
切换到 Generational ZGC 的工作负载可能会在日志输出以及可从可服务性和管理 API 获得的数据方面存在差异。
测试
我们将确保现有测试不受弃用选项警告的影响,并且它们在与此次更改之前的相同配置下通过。
风险与假设
此 JEP 与其风险和假设与 JEP 439: Generational ZGC 共享。
分代 ZGC 的表现将不同于非分代 ZGC。这带来的主要风险是,某些工作负载本质上是非分代的,因此可能会看到轻微的性能下降。我们认为,这部分工作负载所占的比例足够小,不足以证明长期维护两个不同版本的 ZGC 所需的成本是合理的。
具体风险包括:
-
用户可能需要调整针对非分代 ZGC 调优的配置。
-
弃用警告消息可能会导致问题。
-
紧密耦合到 JVM 内部、GC 日志以及通过管理接口可用的数据的工作负载可能需要额外关注。