Вопрос с собеседования · Java

Как выбрать сборщик мусора: 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
  • Выбор подтверждают нагрузочным тестом по перцентилям пауз, а не среднему

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

Подробно

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.

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования