跳到主要内容

JEP 377:ZGC:一个可扩展的低延迟垃圾收集器(生产环境适用)

QWen Max 中英对照 JEP 377: ZGC: A Scalable Low-Latency Garbage Collector (Production)

总结

将 Z 垃圾收集器从实验性功能更改为产品功能。

非目标

本 JEP 不建议更改默认的 GC,它仍然是 G1。

动机

ZGC 通过 JEP 333 被集成到 JDK 11 中。如此规模和复杂性的新功能最好谨慎而逐步地引入,因此我们将其设为实验性功能。这有助于设定用户的期望值,并允许用户在无需下载或构建单独的 JDK 二进制文件的情况下提供反馈,而如果 ZGC 的开发继续在 JDK 外部进行,则需要这样做。

自从 JDK 11 中引入它以来,我们收到了积极的反馈,修复了许多错误,并添加了一些功能和增强功能。以下是一些较为重要的内容:

  • 并发类卸载
  • 未使用内存的反提交(JEP 351
  • 最大堆大小从 4 TB 增加到 16 TB
  • 最小堆大小减少到 8 MB
  • -XX:SoftMaxHeapSize
  • 支持 JFR 泄漏分析器
  • 支持类数据共享
  • 有限且不连续的地址空间
  • 支持将堆放置在 NVRAM 上
  • 改进的 NUMA 感知能力
  • 多线程堆预触碰

此外,所有常用的平台现在都支持:

对 ZGC 的测试表明,它很稳定,而且截至本文撰写之时,我们已经有几个月没有收到新的 ZGC 特定错误。鉴于 ZGC 目前所具备的稳定性、功能集和平台支持,是时候取消其实验状态并将其作为产品特性了。

描述

如今,通过 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC 命令行选项可以启用 ZGC。将 ZGC 变为产品(非实验性)功能意味着将不再需要 -XX:+UnlockExperimentalVMOptions 选项。

将 ZGC 转变为产品(非实验性)功能主要是将 UseZGC 命令行选项类型从 experimental 改为 product 的问题。此外,我们还会将以下目前标记为 experimental 的 ZGC 特定选项更改为 product。这些选项的默认值将保持不变。

ZAllocationSpikeTolerance
ZCollectionInterval
ZFragmentationLimit
ZMarkStackSpaceLimit
ZProactive
ZUncommit
ZUncommitDelay

以下标记为 experimental 的 ZGC 特定 JFR 事件也将更改为 product

ZAllocationStall
ZPageAllocation
ZPageCacheFlush
ZRelocationSet
ZRelocationSetGroup
ZUncommit

测试

作为 JEP 333 的一部分,添加了对 ZGC 的测试,并且从那时起又添加了更多的测试。作为此 JEP 的一部分,不会开发其他测试。

一些测试在启用 ZGC 时当前会提供 -XX:+UnlockExperimentalVMOptions 命令行选项。这将不再需要,这些测试也将相应地进行调整。