← Назад к вопросам

Какой сборщик мусора по умолчанию в Java 11?

1.2 Junior🔥 211 комментариев
#JVM и управление памятью

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Сборщик мусора в Java 11

Ответ

G1GC (Garbage First Garbage Collector) — это сборщик мусора по умолчанию в Java 11.

Это был значительный сдвиг от Java 8, где по умолчанию использовался Parallel GC.

История сборщиков в Java

Java 8:

# Параллельный сборщик мусора (Parallel GC) — по умолчанию
java -XX:+UseParallelGC MyApp

Java 9-10:

# G1GC становится экспериментальным (рекомендуемым)
java -XX:+UseG1GC MyApp

Java 11+:

# G1GC — по умолчанию!
java MyApp  # автоматически использует G1GC

Что такое G1GC

G1GC расшифровывается как Garbage First — это современный сборщик мусора, оптимизированный для больших куч памяти (от 2GB и выше).

Как работает G1GC

Разделение памяти на регионы:

Heap (8GB total):
┌─────────────────────────────────────────┐
│ Region1 │ Region2 │ Region3 │ Region4 │  Young Generation (молодое поколение)
│ Region5 │ Region6 │ Region7 │ Region8 │  
│ Region9 │Region10 │Region11 │Region12│  Old Generation (старое поколение)
│Region13 │Region14 │Region15 │Region16│  
└─────────────────────────────────────────┘

Каждый регион ~2MB
G1 собирает мусор в областях, где больше всего мусора (Garbage First)

Фазы сборки мусора:

  1. Young Generation Collection (Minor GC)

    • Очищает молодое поколение
    • Быстрая операция (~50-100ms)
    • Копирует живые объекты в старое поколение
  2. Concurrent Marking (фоновая работа)

    • Работает параллельно с приложением
    • Помечает живые объекты
    • Минимизирует паузы
  3. Mixed Collections

    • Собирает мусор и из молодого, и из старого поколения
    • Целевой параметр: Max GC Pause Time (по умолчанию 200ms)

Преимущества G1GC

1. Предсказуемые паузы (Low Latency)

// Параллельный GC может создать паузу в 1-2 секунды
// G1GC старается держать паузу в пределах целевого времени

java -XX:MaxGCPauseMillis=200 MyApp  // попытается держать паузы ≤ 200ms

2. Хороша для больших куч (Large Heaps)

# Оптимальна для куч > 2GB
java -Xmx8g -Xms8g MyApp

# Parallel GC в этом случае создаст очень долгие паузы
# G1GC справляется намного лучше

3. Фоновая работа (Concurrent Processing)

  • Большая часть сборки происходит во время работы приложения
  • Меньше полных пауз (Full GC)

4. Улучшенное управление памятью

  • Автоматическая балансировка молодого/старого поколения
  • Меньше фрагментации памяти

Сравнение сборщиков

Seriал GC (Single threaded):
java -XX:+UseSerialGC MyApp
└─ Используется редко, только для микроприложений

Parallel GC (Throughput-oriented):
java -XX:+UseParallelGC MyApp  // Java 8 по умолчанию
└─ Хорош для batch обработки, где паузы менее критичны
   Высокий throughput, но долгие паузы

CMS (Concurrent Mark Sweep) — устаревший:
java -XX:+UseConcMarkSweepGC MyApp
└─ Deprecated в Java 9, удалён в Java 14
   Low latency, но фрагментация памяти

G1GC (Garbage First) — рекомендуемый:
java -XX:+UseG1GC MyApp  // Java 11+ по умолчанию
└─ Оптимальный баланс для всех случаев
   Предсказуемые паузы, хорошо масштабируется

ZGC (Ultra-low latency) — новый:
java -XX:+UseZGC MyApp  // Java 11+, экспериментальный
└─ Для систем с экстремальными требованиями к latency
   Паузы < 10ms даже на куче 16TB

Shenandoah — альтернатива:
java -XX:+UseShenandoahGC MyApp  // Java 12+
└─ Конкурент ZGC, тоже ultra-low latency

Параметры G1GC

# Целевая пауза (важнейший параметр)
java -XX:MaxGCPauseMillis=200 MyApp  # по умолчанию 200ms

# Процент молодого поколения
java -XX:G1NewCollectionHeapRegionCount=4 MyApp

# Параллельные потоки для GC
java -XX:ParallelGCThreads=8 MyApp

# Задний GC потоки (concurrent)
java -XX:ConcGCThreads=2 MyApp

# Инициирование concurrent mark
java -XX:InitiatingHeapOccupancyPercent=35 MyApp

# Пример production конфигурации
java -Xmx8g -Xms8g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:ParallelGCThreads=8 \
  -XX:ConcGCThreads=2 \
  -XX:+PrintGCDetails \
  -XX:+PrintGCDateStamps \
  -Xloggc:gc.log \
  MyApp

Мониторинг G1GC

# Просмотр GC логов
java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log MyApp

# Анализ GC логов
# Инструменты: GCViewer, Analyse GC (онлайн), JMC (Java Mission Control)

Новые сборщики мусора (Java 15+)

ZGC (Z Garbage Collector) — рекомендуемый для low-latency:

java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC MyApp
# Паузы < 10ms на любом размере кучи
# Требует Java 15+

Shenandoah — конкурент ZGC:

java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC MyApp

Когда менять GC

G1GC достаточно для большинства приложений.

Меняй на ZGC/Shenandoah только если:

  • GC паузы > 100ms критичны
  • Куча > 4GB
  • Есть требование к latency (финансовые системы, trading)

Практический совет

# Стандартный production setup для Java 11+
java -Xmx4g -Xms4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -Duser.timezone=UTC \
  -jar myapp.jar

Вывод

G1GC в Java 11 — это современный выбор, оптимальный для большинства приложений. Обеспечивает низкие паузы, масштабируется на большие кучи и работает эффективнее своих предшественников.