0Pricing
Java Academy · Урок

Алгоритмы сборки мусора: 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 crunching

G1 (сборщик «сначала мусор»)

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 — локальная установка не требуется.

Все уроки этого курса

  1. Области кучи JVM и жизненный цикл объектов
  2. Алгоритмы сборки мусора: Serial, G1, ZGC и Shenandoah
  3. Обнаружение и устранение утечек памяти
  4. Флаги настройки сборки мусора и профилирование в JVisualVM
← Назад к Java Academy