Получение 'стойла выделения' при включении ZGC
Я тестирую новый zgc
сборщик мусора, который был включен в java
11, поскольку обещает очень низкую задержку. Наше приложение представляет собой службу реального времени, которая создает и уничтожает множество объектов в секунду и делает это в многопоточной среде, используя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 и ОС.