常做 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 邮件列表。
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 邮件列表。