Выбор ответа Senior JVM: память, GC, загрузка классов обновлено

G1 или ZGC

Вопрос

Сервис с кучей 64 ГБ должен отвечать с p99 меньше 10 мс, паузы G1 доходят до 150 мс. Что попробовать в первую очередь?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: ZGC (-XX:+UseZGC): паузы обычно меньше миллисекунды на любой куче. ZGC делает почти всю работу конкурентно, паузы очень короткие и не растут с размером кучи, это как раз сценарий низкой задержки на больших кучах.

Варианты ответа

  1. ZGC (-XX:+UseZGC): паузы обычно меньше миллисекунды на любой кучеправильный ответ
  2. Parallel GC: он самый быстрый и даёт минимальные паузы на больших кучах
  3. Уменьшить -Xmx до 4 ГБ, чтобы G1 сканировал меньше памяти
  4. Вызывать System.gc() по таймеру в периоды низкой нагрузки сервиса

Разбор

ZGC делает почти всю работу конкурентно, паузы очень короткие и не растут с размером кучи, это как раз сценарий низкой задержки на больших кучах. Цена: немного меньшая пропускная способность и больше CPU. Parallel максимизирует пропускную способность, но паузы у него длиннее. Урезать кучу, не понимая профиля памяти, значит получить OOM. Ручной System.gc() вызывает полную сборку и сам по себе даёт долгую паузу.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме