Заставьте ZGC запускаться часто

ZGC запускается недостаточно часто. Журналы GC показывают, что он запускается каждые 2-3 минуты для моего приложения, и из-за этого мое использование памяти увеличивается между циклами GC (до 90%). После ГХ он падает до 20%.

Как увеличить частоту запуска GC, чтобы запускать чаще?

3 ответа

-XX:ZCollectionInterval=N - установить максимальный интервал между коллекциями в N секунд.
-XX:ZUncommitDelay=M - установить задержку возврата неиспользуемой памяти в ОС на M секунд.

В настоящее время ( начиная с JDK 17) основная стратегия ZGC - дождаться последнего возможного момента заполнения кучи, а затем выполнить сбор. Его цели

  • Избегайте ненужной нагрузки на ЦП, запуская сборщик мусора только тогда, когда это необходимо.
  • Запустите сборщик мусора достаточно рано, чтобы он завершился до фактического заполнения кучи (поскольку заполнение кучи было бы плохим, что привело бы к временной остановке приложения).

Он делает это, измеряя, насколько быстро ваше приложение выделяет память, сколько времени требуется для запуска GC, и прогнозируя, в какой момент он должен запустить GC. Вы можете найти точный алгоритм в исходном коде.

ZGC также предоставляет некоторые регуляторы для более частого запуска GC (т.е. проактивно), но, честно говоря, я не считаю их очень эффективными. Вы можете найти больше информации в моем другом ответе . G1 лучше проактивен, но хорошо это или нет, зависит от вашего варианта использования. (Похоже, вы больше заботитесь о пропускной способности, чем об использовании памяти, поэтому я думаю, вам следует предпочесть поведение ZGC.)

Однако, если вы обнаружите, что ZGC делает ошибки в прогнозировании, когда куча заполнится, и что ваше приложение действительно попадает в лапы, поделитесь этой информацией здесь или в списке рассылки ZGC.

Before tuning the GC, I would recommend to investigate why this is happening. Might have some issue/bug in your application.

[Some notes about GC]

  • -XX:ZUncommitDelay=M (Check if it is supported by your linux kernel)
  • -XX:+ZProactive: Enables proactive GC cycles when using ZGC. By default, this option is enabled. ZGC will start a proactive GC cycle if doing so is expected to have minimal impact on the running application. This is useful if the application is mostly idle or allocates very few objects, but you still want to keep the heap size down and allow reference processing to happen even when there are a lot of free space on the heap.

More details about ZGC config. options can be found:

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