跳到主要内容

JEP 474:ZGC:默认分代模式

概括

将 Z 垃圾收集器 (ZGC) 的默认模式切换为分代模式。弃用非分代模式,并打算在未来版本中将其删除。

目标

  • 表明未来的发展将集中在Generational ZGC上。

  • 支持两种不同模式,降低维护成本。

非目标

  • 从目标版本中删除非分代 ZGC 并不是目标。

动机

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

对于大多数用例来说,分代 ZGC 应该是比非分代 ZGC 更好的解决方案。我们最终应该能够用前者取代后者,以减少长期维护成本。

描述

ZGenerational通过将选项的默认值从 更改false为 ,使 Generational ZGC 成为 ZGC 的默认模式true。通过弃用该选项来弃用非分代模式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 日志以及通过管理接口提供的数据紧密耦合的工作负载可能需要额外关注。