启用ZGC时出现'分配停顿'

问题描述 投票:2回答:1

我正在测试zgc 11中包含的新java垃圾收集器,因为它保证了非常低的延迟。我们的应用程序是一种实时服务,每秒可创建和销毁许多对象,并使用akka在多线程环境中进行处理。

[通过传递选项zgc并启用-XX:+UnlockExperimentalVMOptions -XX:+UseZGC日志来启用[​​C0]时,我们可以在日志中看到许多类似于以下内容的消息:

gc

并且几秒钟后JVM存在,没有给出任何原因。我们正在运行[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.remote.default-remote-dispatcher-6) 11332.231ms [2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.remote.default-remote-dispatcher-26) 9898.046ms [2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-io-blocking-dispatcher-52) 12133.240ms [2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.actor.default-dispatcher-54) 9002.299ms [2020-05-20T18:05:36.563+0000][63.850s][info ][gc] Allocation Stall (Main-io-blocking-dispatcher-50) 12134.218ms [2020-05-20T18:05:36.563+0000][63.850s][info ][gc] Allocation Stall (Main-akka.actor.default-dispatcher-46) 12132.540ms [2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.actor.default-dispatcher-56) 8072.664ms 。关于如何做这项工作的任何建议?

java garbage-collection java-11 zgc
1个回答
0
投票

分配停顿意味着某事正在请求堆,但没有堆可用,因此请求线程正在阻塞。确保您有足够的gc线程设置。 JDK可能无法检测核心计数,这是gc线程的默认值是从中得出的,尤其是在使用Docker时。参见openjdk-java-11

如果在这些时间段内您的CPU使用率很低,则很可能出现此问题。

通常,启用https://wiki.openjdk.java.net/display/zgc/Main#Main-SettingConcurrentGCThreads有助于提高ZGC的性能。 hugepages

另外,您可能只需要更多堆。

编辑要添加:也许还值得确保您使用的是最新版本的jdk和操作系统。

© www.soinside.com 2019 - 2024. All rights reserved.