系列中的上一篇
当前教程
ZGC 概述
系列中的下一篇

系列中的上一篇: Java 中的垃圾回收

系列中的下一篇: 深入了解 ZGC 的架构

ZGC 概述

 

介绍

ZGC 是一款几乎完全并发的、可扩展的、低延迟的垃圾回收器。它能够支持从 8 MB 到 16 TB 的堆,同时保持一致的亚毫秒暂停时间,无论活动集大小如何。

ZGC 在 JDK 11 中作为实验性功能引入;并在 JDK 15 版本中成为生产功能。本文将对 ZGC 进行高级解释,包括如何开始使用它以及如何配置 ZGC。

 

开始使用 ZGC

可以使用以下命令启用 ZGC

-XX:+UseZGC

首次使用 ZGC 时,建议启用 GC 日志记录,这可以提供有关 ZGC 正在执行的操作的更多诊断信息,这对于调整目的和比较使用 ZGC 与其他 GC 时性能改进或回归非常有用。将 GC 日志记录设置为 info 可以通过以下方式启用

-Xlog:gc

有关启用和配置 GC 日志记录的更详细的信息,请查看 此处提供的参考指南。

 

配置 ZGC

ZGC 的设计目的是需要最少的配置。在大多数情况下,唯一需要的配置是设置最大堆大小 -Xmx。设置最大堆大小时,重要的是要提供超出预期活动集大小的余量。提供的余量越大,ZGC 承受的分配压力就越小,因此性能越好。但是,这需要权衡不浪费内存的愿望。提供多少余量的具体平衡将根据具体情况而定,因此需要测试和调整才能找到适合您需求的理想设置。

其他 ZGC 配置

  • -XX:ConcGCThreads - ZGC 将通过内部 GC 启发式自动设置它将使用的并发线程数量,但是此设置可以手动配置为
  • -XX:UseLargePages - 在 Linux 系统上,可以将 ZGC 配置为使用大页面。这通常会带来性能改进,而缺点很少,但需要复杂的设置,包括 root 访问权限。有关此配置选项的更多信息,请阅读 此处
  • -XX:+UseTransparentHugePages - 大页面可以用作 Linux 系统上的大页面的替代方案。但是,使用大页面可能会导致一些性能下降,请务必阅读更多 此处 有关如何配置大页面以及涉及的一些缺点的信息。
  • -XX:+UseNUMA - ZGC 提供 NUMA 支持,默认情况下启用。这可以通过 -XX:+UseNUMA 显式启用,并通过 -XX:-UseNUMA 禁用。
  • -XX:ZAllocationSpikeTolerance=factor - 设置 ZGC 的分配峰值容忍度。默认情况下,此选项设置为 2.0。此因子描述了预期分配峰值的级别。例如,使用 3.0 的因子意味着当前分配率可以预期在任何时候都增加三倍。
  • -XX:ZCollectionInterval=seconds - 设置使用 ZGC 时两个 GC 周期之间的最大间隔(以秒为单位)。默认情况下,此选项设置为 0(禁用)。
  • -XX:ZFragmentationLimit=percent - 设置 ZGC 的最大可接受堆碎片(以百分比表示)。默认情况下,此选项设置为 25。使用较低的值会导致堆更积极地压缩,以更积极地回收内存,但代价是使用更多 CPU 时间。
  • -XX:+ZProactive - 启用使用 ZGC 时主动 GC 周期。默认情况下,此选项已启用。如果这样做预计对正在运行的应用程序的影响最小,ZGC 将启动主动 GC 周期。如果应用程序大部分处于空闲状态或分配的对象很少,但您仍然希望将堆大小保持在较低水平并允许引用处理即使堆上有大量可用空间也能发生,这将非常有用。
  • -XX:+ZUncommit - 启用使用 ZGC 时取消提交未使用的堆内存。默认情况下,此选项已启用。取消提交未使用的堆内存将降低 JVM 的内存占用,并使该内存可供其他进程使用。
  • -XX:ZUncommitDelay=seconds - 设置堆内存必须未被使用多长时间(以秒为单位)才能被取消提交。默认情况下,此选项设置为 300(5 分钟)。提交和取消提交内存是相对昂贵的操作。使用较低的值会导致堆内存更早地被取消提交,但有可能会很快再次提交。

 

何时使用 ZGC 以及何时避免使用 ZGC

ZGC 的设计目的不是要成为对现有 GC(如 G1 GC、Parallel GC 或 Serial GC)的通用升级,而是要满足最小化延迟时间和扩展到大型活动集的特定需求。因此,在从其他垃圾回收器切换到 ZGC 时,您可能不会看到性能改进,甚至可能会出现性能下降。

ZGC 的低延迟和扩展以处理大型活动集的能力使其成为 Web 应用程序的理想选择。Web 应用程序经常同时服务许多请求,这通常会导致维护更大的活动集。一致的响应能力也有助于系统稳定性。这与 ZGC 的优势相得益彰。

另一方面,虽然 ZGC 可以使用小至 8 MB 的堆,但强烈建议不要在这种情况中使用 ZGC。ZGC 是一种并发 GC,在单核处理器或 CPU 资源有限的系统上使用时,会遇到严重的性能问题。

ZGC 中的可扩展性优势主要针对扩展向上以处理非常大的工作负载,而不是扩展向下处理非常小的工作负载。

更多学习


上次更新: 2022 年 3 月 6 日


系列中的上一篇
当前教程
ZGC 概述
系列中的下一篇

系列中的上一篇: Java 中的垃圾回收

系列中的下一篇: 深入了解 ZGC 的架构