常做 ZGC 运行

Make ZGC run often

ZGC 运行 不够频繁。 GC 日志显示我的应用程序每 2-3 分钟 运行s 一次,因此,我的内存使用率在 GC 周期之间变高(高达 90%)。 GC 之后,它会下降到 20%。

如何将 GC 运行 的频率提高到 运行 更频繁?

-XX:ZCollectionInterval=N - 将集合之间的最大间隔设置为 N 秒。
-XX:ZUncommitDelay=M - 将未使用的内存返回到 OS 之前的延迟设置为 M 秒。

在调整 GC 之前,我建议调查为什么会发生这种情况。您的应用程序中可能有一些 issue/bug。

[关于 GC 的一些注意事项]

  • -XX:ZUncommitDelay=M(检查你的linux内核是否支持)
  • -XX:+ZProactive:在使用 ZGC 时启用主动 GC 周期。默认情况下,此选项已启用。如果预期 ZGC 对 运行 应用程序的影响最小,ZGC 将启动主动 GC 周期。如果应用程序大部分空闲或分配的对象很少,但您仍然希望保持堆大小较小并允许引用处理发生,即使堆上有很多空闲 space。

关于 ZGC 配置的更多详细信息。可以找到选项:

目前(截至JDK 17),ZGC 的主要策略是等到堆填满的最后一刻,然后进行回收。它的目标是

  • 避免不必要的 CPU 加载,仅在必要时 运行 使用 GC。
  • 尽早启动 GC,以便它在堆实际填满之前完成(因为堆填满会很糟糕,导致临时应用程序停顿)。

它通过测量您的应用分配内存的速度、GC 花费多长时间 运行 并预测它应该在什么时候开始 GC 来实现这一点。您可以在 the source code.

中找到确切的算法

ZGC 还更频繁地(即主动地)公开一些 运行ning GC 的旋钮,但老实说,我并不觉得它们非常有效。您可以在我的 other answer 中找到更多信息。 G1 在主动方面做得更好,但这是否好取决于您的用例。 (听起来你更关心吞吐量而不是内存使用,所以我认为你应该更喜欢 ZGC 的行为。)

但是, 如果您发现 ZGC 在预测堆何时填满时出错并且您的应用程序确实遇到了停顿,请在此处或在ZGC 邮件列表。