Получить доступ

Как выбрать сборщик мусора: Parallel, G1 или ZGC?

SeniorJVM и сборка мусора
Ещё спрашивают так:
  • Сервис с кучей 16 ГБ должен держать задержку в десятках миллисекунд. Какой сборщик выбрать?
  • Сервис с кучей в 16 ГБ должен держать задержку ответа в пределах десятков миллисекунд. Какой сборщик выберешь и почему?
Коротко

Ось выбора — пропускная способность против задержки. Parallel — максимум throughput, паузы растут с кучей: батчи. G1 (по умолчанию с JDK 9) — баланс с целевой паузой MaxGCPauseMillis. ZGC (или Shenandoah) — паузы под миллисекунду почти независимо от размера кучи ценой CPU.

  • 16 ГБ и SLA в десятки мс — ZGC; на JDK 21+ поколенческий
  • Маленькая куча и 1–2 CPU — JVM сама выберет Serial
  • Выбор подтверждают нагрузочным тестом по перцентилям пауз, а не среднему

А ещё Сборщик не лечит высокий темп аллокаций и утечки

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

ParallelG1ZGC
цельthroughputбалансминимальные паузы
паузысотни мс — секунды, растут с кучейдесятки — сотни мс, цель задаётся< 1 мс
платадлинные паузысредняя~10–15% CPU, больше памяти
гдебатчи, аналитикабольшинство сервисовlow-latency, большие кучи

Parallel собирает всё в паузе, но многими потоками — максимальная доля времени на полезную работу.

G1 делит кучу на регионы, собирает в первую очередь самые «мусорные» (отсюда Garbage First) и подбирает объём работы под цель -XX:MaxGCPauseMillis (по умолчанию 200 мс). Маркировка старого поколения конкурентная, эвакуация — в паузе.

ZGC выполняет и маркировку, и перемещение конкурентно, опираясь на барьеры чтения и цветные указатели. Остановки — только короткие служебные этапы. С JDK 21 есть поколенческий режим (с JDK 23 — по умолчанию), который заметно снижает накладные расходы. Shenandoah — похожий подход от Red Hat.

Порядок решения: сформулировать SLA (p99 паузы), измерить на текущем сборщике, попробовать альтернативу под той же нагрузкой, сравнить и паузы, и потребление CPU.

Что хотят услышать

  • Компромисс throughput и latency.
  • Свойства каждого сборщика.
  • Выбор под конкретный SLA и подтверждение измерениями.

Частые ошибки

  • «ZGC всегда лучше» — без учёта цены по CPU.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Parallel — максимум throughput при терпимых паузах (батч/аналитика); G1 (дефолт) — баланс и предсказуемые паузы; ZGC — суб-мс паузы на больших кучах при жёстких SLA на задержки
  • ✗ZGC всегда лучше — и максимальный throughput, и минимальные паузы сразу
  • ✗Serial — для продакшена, остальные только для тестов
  • ✗CMS — современный дефолт для низколатентных сервисов

Что спросят дальше

  • Что значит garbage-first в G1?
  • За счёт чего ZGC держит паузы суб-мс?
  • Что такое safepoint и почему пауза может затянуться из-за него?
  • В каком случае Parallel окажется лучшим выбором?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем