Алгоритмы сборки мусора: Serial, G1, ZGC и Shenandoah
Сравните характеристики пауз сборки мусора и компромиссы между пропускной способностью современных сборщиков JVM.
«Алгоритмы сборки мусора: Serial, G1, ZGC и Shenandoah» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Выбор алгоритма сборки мусора
JVM поставляется с несколькими алгоритмами сборки мусора, каждый из которых оптимизирован для разных рабочих нагрузок. Выбор подходящего алгоритма зависит от размера кучи, требований к задержке и целей по пропускной способности.
// Enable GC algorithms:
// -XX:+UseSerialGC
// -XX:+UseParallelGC
// -XX:+UseG1GC (default since Java 9)
// -XX:+UseZGC (Java 15+ production)
// -XX:+UseShenandoahGC (Red Hat / OpenJDK builds)Последовательная сборка мусора
Последовательная сборка мусора использует один поток для очистки. Во время сборки мусора все потоки приложения останавливаются — происходит «остановка всего мира». Подходит только для небольших куч или сред с одним процессором, например встроенных систем.
// Use:
// java -XX:+UseSerialGC -Xmx256m MyApp
// Pauses: long (proportional to heap size)
// Throughput: low
// Best for: CLI tools, small heaps < 100 MBПараллельная сборка мусора (сборщик пропускной способности)
Параллельная сборка мусора использует несколько потоков для малых и основных сборок мусора. Паузы с остановкой всего мира короче, чем при последовательной сборке, но всё ещё значительны. Лучше всего подходит для пакетной обработки, где пропускная способность важнее задержки.
// Use:
// java -XX:+UseParallelGC -XX:ParallelGCThreads=8 MyApp
// Pauses: moderate
// Throughput: high
// Best for: batch jobs, number crunchingG1 (сборщик «сначала мусор»)
G1 делит кучу на области одинакового размера — от ~2 KB до 32 MB. Сначала он собирает области с наибольшим количеством мусора, соблюдая настраиваемую целевую продолжительность паузы. Используется по умолчанию начиная с Java 9.
// Use:
// java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 MyApp
// Pauses: bounded by target (but not guaranteed)
// Throughput: good
// Best for: large heaps (4 GB+), mixed workloadsТипы областей G1
Областям G1 динамически назначаются роли Эдема, выживших объектов, старого поколения или гигантских объектов — для объектов размером более 50% размера области. Такая гибкость позволяет выполнять инкрементальную сборку.
ZGC (сборщик мусора Z)
ZGC выполняет большую часть работы одновременно с приложением. Продолжительность пауз обычно не превышает 1 мс независимо от размера кучи. Готов для промышленного использования начиная с Java 15.
// Use:
// java -XX:+UseZGC -Xmx16g MyApp
// Pauses: < 1 ms (usually)
// Throughput: slightly lower than G1 (concurrent work has CPU cost)
// Best for: large heaps, low-latency services (APIs, trading)Сборка мусора Shenandoah
Shenandoah от Red Hat также обеспечивает паузы менее миллисекунды благодаря параллельной дефрагментации. Доступен в сборках OpenJDK. Цели у него очень похожи на цели ZGC, но внутренние алгоритмы отличаются.
// Use:
// java -XX:+UseShenandoahGC MyApp
// Available in: Red Hat builds, some AdoptOpenJDK distributions
// Pauses: sub-millisecond
// Best for: latency-sensitive workloadsПоколенческий ZGC (Java 21+)
В Java 21 появился поколенческий ZGC, объединяющий подход ZGC с короткими паузами и сборку мусора по поколениям. Это снижает нагрузку на CPU, сохраняя минимальную продолжительность пауз.
// Enable in Java 21+:
// java -XX:+UseZGC -XX:+ZGenerational -Xmx8g MyAppКомпромисс между продолжительностью пауз и пропускной способностью
Ни один алгоритм сборки мусора не идеален во всех отношениях. Параллельная сборка мусора максимизирует пропускную способность. G1 уравновешивает пропускную способность и задержку. ZGC и Shenandoah сводят паузы к минимуму ценой небольшого снижения пропускной способности.
Включение журналирования сборки мусора
Журналируйте события сборки мусора с помощью -Xlog:gc*:file=gc.log:time,uptime,level. Анализируйте журналы такими инструментами, как GCViewer или GCEasy, чтобы находить длительные паузы и резкие всплески выделения памяти.
// JVM flags:
// -Xlog:gc*:file=gc.log:time,uptime,level,tags
// Inspect logs:
// cat gc.log | grep "Pause"Мониторинг сборки мусора с помощью метрик JVM
Используйте ManagementFactory.getGarbageCollectorMXBeans(), чтобы программно считывать количество и продолжительность сборок мусора, или экспортируйте эти данные в Prometheus через Micrometer в приложениях Spring Boot.
ManagementFactory.getGarbageCollectorMXBeans().forEach(gc ->
System.out.printf("%s: %d collections, %d ms%n",
gc.getName(), gc.getCollectionCount(), gc.getCollectionTime()));Быстрая проверка
Какой алгоритм сборки мусора обеспечивает паузы менее миллисекунды в рабочей среде?
Повторение
Последовательная сборка мусора подходит для крошечных куч, параллельная — для пропускной способности при пакетной обработке, G1 — для сбалансированных рабочих нагрузок и используется по умолчанию, а ZGC и Shenandoah — для чрезвычайно низкой задержки. Включайте журналирование сборки мусора в рабочей среде, чтобы заранее обнаруживать проблемы.
Часто задаваемые вопросы
Урок «Алгоритмы сборки мусора: Serial, G1, ZGC и Shenandoah» бесплатный?
Да — полный текст урока «Алгоритмы сборки мусора: Serial, G1, ZGC и Shenandoah» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Алгоритмы сборки мусора: Serial, G1, ZGC и Shenandoah»?
Сравните характеристики пауз сборки мусора и компромиссы между пропускной способностью современных сборщиков JVM. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Алгоритмы сборки мусора: Serial, G1, ZGC и Shenandoah»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Области кучи JVM и жизненный цикл объектов
- Алгоритмы сборки мусора: Serial, G1, ZGC и Shenandoah
- Обнаружение и устранение утечек памяти
- Флаги настройки сборки мусора и профилирование в JVisualVM