Какой сборщик мусора по умолчанию в Java 11?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Сборщик мусора в 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)
Фазы сборки мусора:
-
Young Generation Collection (Minor GC)
- Очищает молодое поколение
- Быстрая операция (~50-100ms)
- Копирует живые объекты в старое поколение
-
Concurrent Marking (фоновая работа)
- Работает параллельно с приложением
- Помечает живые объекты
- Минимизирует паузы
-
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 — это современный выбор, оптимальный для большинства приложений. Обеспечивает низкие паузы, масштабируется на большие кучи и работает эффективнее своих предшественников.