Skip to content

JEP 377: ZGC: A Scalable Low-Latency Garbage Collector (Production) | ZGC:可扩展的低延迟垃圾收集器

摘要

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

非目标

本 JEP 并不打算更改默认 GC,默认 GC 仍然是 G1。

动机

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

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

  • 并发的类卸载
  • 释放未使用的内存(JEP 351
  • 最大堆大小从 4TB 增加到 16TB
  • 最小堆大小降低到 8MB
  • -XX:SoftMaxHeapSize
  • 支持 JFR 泄漏分析器
  • 支持类数据共享
  • 有限且不相邻的地址空间
  • 支持将堆放在 NVRAM 上
  • 改进的 NUMA 感知
  • 多线程堆预接触

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

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

描述

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

将 ZGC 变为产品(非实验性)功能主要涉及到将 UseZGC 命令行选项的类型从 experimental 更改为 product。此外,我们还将把以下当前标记为 experimental 的特定于 ZGC 的选项更改为 product。我们不会更改这些选项的默认值。

java
ZAllocationSpikeTolerance
ZCollectionInterval
ZFragmentationLimit
ZMarkStackSpaceLimit
ZProactive
ZUncommit
ZUncommitDelay

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

java
ZAllocationStall
ZPageAllocation
ZPageCacheFlush
ZRelocationSet
ZRelocationSetGroup
ZUncommit

测试

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

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