Старое поколение Java быстро заполняется

У меня проблема с тем, что мой GC (основной) работает каждые несколько часов, так как многие объекты переходят от молодого поколения к старому.
Может кто-нибудь проанализировать и предложить, какой параметр я должен изменить, чтобы настроить мой GC?
Мои параметры конфигурации GC:
-Xms6144M -Xmx6144M -Xloggc:gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=128K -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/heapdump -XX:SurvivorRatio=4

Ниже приведены диаграммы GC:

1 ответ

Решение

Если вас беспокоит продолжительность полного GC, вы можете переключиться на одновременный коллектор (например, CMS с -XX:+UseParNewGC -XX:+UseConcMarkSweepGC) и надеюсь, что полный сбор будет меньше. Другой подход заключается в уменьшении общего размера кучи, поскольку полная продолжительность GC обычно пропорциональна размеру кучи. Вы испытываете полный GC каждые 4 часа, если вы испытываете его один раз в час, но в течение четверти продолжительности, возможно, это стоит сделать.

Вы можете попытаться уменьшить количество живых объектов, перемещающихся из Нового Пространства в Старое Пространство, увеличив New Size (например, напрямую используя -XX:NewSize=3g -XX:MaxNewSize=3g). Однако только вы знаете, что делает ваше приложение и каковы схемы распределения, а текущий 2g является щедрым.

Также может помочь обновление до более новой JVM, например, поскольку часть Java 10 G1 была полностью распараллелена (JEP 307). Есть хорошая статья о настройке производительности JVM в Espresso, которая сравнивает CMS с G1.

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