Как выбрать сборщик мусора (Garbage Collector) в Java?

«Как выбрать сборщик мусора (Garbage Collector) в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор GC зависит от целевых метрик приложения: пропускной способности (throughput), задержек (latency) или использования памяти (footprint).

Основные сборщики и их применение:

Сборщик Ключ запуска Цель использования
Serial GC -XX:+UseSerialGC Однопоточные приложения, маленькая куча (<100 МБ), клиентские программы.
Parallel GC -XX:+UseParallelGC Максимизация пропускной способности (дефолт до Java 8). Подходит для фоновых задач, не критичных к паузам.
G1 GC -XX:+UseG1GC Баланс пропускной способности и пауз (дефолт с Java 9+). Кучи от нескольких ГБ до десятков ГБ.
Z GC -XX:+UseZGC Минимизация пауз (<10 мс) для очень больших куч (сотни ГБ). Требует Java 11+.
Shenandoah GC -XX:+UseShenandoahGC Аналогичен Z GC, но с другим алгоритмом. Низкие паузы, независимо от размера кучи.

Пример выбора и настройки G1 GC:

java -XX:+UseG1GC -Xmx4g -XX:MaxGCPauseMillis=200 -jar myapp.jar

Параметры:

  • -Xmx4g — максимальный размер кучи 4 ГБ.
  • -XX:MaxGCPauseMillis=200 — целевое время паузы 200 мс (рекомендация для G1).

Критерии выбора:

  1. Допустимая длина пауз (SLA): Для UI или real-time систем — Z/Shenandoah/G1. Для batch-обработки — Parallel.
  2. Размер кучи: Для больших куч (>32GB) — Z, Shenandoah или G1.
  3. Аппаратные ресурсы: Parallel и G1 требуют больше CPU для сокращения пауз.

Рекомендация: Начинайте с G1 (дефолтный) и настраивайте под конкретные замеры производительности.