Получение 'стойла выделения' при включении ZGC

Я тестирую новый zgc сборщик мусора, который был включен в java11, поскольку обещает очень низкую задержку. Наше приложение представляет собой службу реального времени, которая создает и уничтожает множество объектов в секунду и делает это в многопоточной среде, используяakka.

При включении zgc передав параметры -XX:+UnlockExperimentalVMOptions -XX:+UseZGC и позволяя gc logs, мы можем видеть много сообщений в журнале, подобных этому:

[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

И через несколько секунд JVM завершает работу без объяснения причин. Мы бежимopenjdk-java-11. Есть предложения о том, что делать, чтобы эта работа работала?

1 ответ

Решение

Срыв выделения означает, что что-то запрашивает кучу, но ничего не доступно, поэтому запрашивающий поток блокируется. Убедитесь, что у вас достаточно настроенных потоков gc. У JDK могут возникнуть проблемы с определением количества ядер, из которого получено значение по умолчанию для потоков gc, особенно при использовании Docker. См. https://wiki.openjdk.java.net/display/zgc/Main

Это особенно вероятно, если ваша загрузка ЦП в эти периоды низкая.

В общем, включение hugepagesможет повысить производительность с ZGC. https://wiki.openjdk.java.net/display/zgc/Main

Кроме того, вам может просто понадобиться больше кучи.

ИЗМЕНИТЬ ДЛЯ ДОБАВЛЕНИЯ: Возможно, также стоит убедиться, что вы используете последний выпуск исправлений jdk и ОС.

Другие вопросы по тегам