Добавить в корзинуПозвонить
Найти в Дзене
Записки о Java

Serial Garbage Collector в Java 11: простой, но не всегда подходящий

Стек: Java 11, JVM, Garbage Collection
Цель: понять, как работает Serial GC, когда его использовать, и почему он включён по умолчанию в некоторых случаях. Serial GC — это самый простой сборщик мусора в JVM. Он: 💡 Идея: максимальная простота → минимальный overhead на управление потоками. JVM делит кучу (heap) на: Поколение Алгоритм Young Mark-Copy (Minor GC) Old Mark-Compact (Major GC / Full GC) ⚠️ Важно: весь GC выполняется в одном потоке, даже на многопроцессорной машине. Serial GC включён по умолчанию в 32-битных JVM и клиентских приложениях. Чтобы явно указать: java -XX:+UseSerialGC -jar myapp.jar Проверить текущий GC: jstat -gc <pid> # Или jcmd <pid> VM.flags | grep UseSerialGC Плюс Объяснение Простота Минимальная сложность кода и отладки Низкий overhead Нет затрат на координацию потоков Малый footprint Подходит для систем с ограниченной памятью (<100 МБ heap) Предсказуемость Поведение одинаково на всех машинах 💡 Идеален для:CLI-утилит,
Встраиваемых систем,
Тестовых ср
Оглавление
Рисунок: Garbage Collectors в JAVA
Рисунок: Garbage Collectors в JAVA

Стек: Java 11, JVM, Garbage Collection
Цель: понять, как работает Serial GC, когда его использовать, и почему он включён по умолчанию в некоторых случаях.

Что такое Serial Garbage Collector?

Serial GC — это самый простой сборщик мусора в JVM. Он:

  • Использует один поток для выполнения всех операций GC,
  • Останавливает все прикладные потоки (Stop-The-World, STW) на время сборки,
  • Работает с младшим (Young) и старшим (Old) поколениями.
💡 Идея: максимальная простота → минимальный overhead на управление потоками.

Как работает Serial GC?

Архитектура памяти (в Java 11)

JVM делит кучу (heap) на:

  • Young Generation (Eden + Survivor S0/S1),
  • Old Generation (Tenured).

Алгоритмы:

Поколение

Алгоритм

Young

Mark-Copy (Minor GC)

Old

Mark-Compact (Major GC / Full GC)

Процесс:

  1. Minor GC (младшее поколение):Все объекты из Eden и одного Survivor копируются в другой Survivor.
    Достигшие возраста — перемещаются в
    Old.
    STW: приложение останавливается.
  2. Major GC (старшее поколение):Все живые объекты уплотняются (compact), чтобы избежать фрагментации.
    STW: приложение останавливается надолго.
⚠️ Важно: весь GC выполняется в одном потоке, даже на многопроцессорной машине.

Как включить Serial GC?

Serial GC включён по умолчанию в 32-битных JVM и клиентских приложениях.

Чтобы явно указать:

java -XX:+UseSerialGC -jar myapp.jar

Проверить текущий GC:

jstat -gc <pid>

# Или

jcmd <pid> VM.flags | grep UseSerialGC

Преимущества Serial GC

Плюс

Объяснение

Простота

Минимальная сложность кода и отладки

Низкий overhead

Нет затрат на координацию потоков

Малый footprint

Подходит для систем с ограниченной памятью (<100 МБ heap)

Предсказуемость

Поведение одинаково на всех машинах

💡 Идеален для:CLI-утилит,
Встраиваемых систем,
Тестовых сред,
Приложений с маленьким heap и низкой нагрузкой.

Недостатки Serial GC

Минус

Объяснение

Долгие паузы

STW длится пропорционально размеру heap

Не масштабируется

Не использует несколько ядер CPU

Плохо для серверов

Неприемлемы паузы в интерактивных приложениях

Пример: heap = 4 ГБ

  • Minor GC: ~100–500 мс,
  • Major GC: несколько секунд.
📉 Производительность падает линейно с ростом heap.

Когда использовать Serial GC? (Рекомендации Oracle)

Сценарий

Рекомендация

Heap ≤ 100 МБ

✅ Идеально

Однопоточное приложение

✅ Подходит

Сервер с высокой нагрузкой

❌ Используйте G1 или ZGC

Интерактивное приложение

❌ Используйте Parallel или G1

Docker-контейнер с 1 CPU

⚠️ Возможно, но лучше Parallel

📌 Oracle официально рекомендует Serial GC только для маленьких heaps.

Пример: сравнение времени GC

Запустим приложение с разными GC:

# Serial GC

java -XX:+UseSerialGC -Xmx512m -jar app.jar

# Parallel GC

java -XX:+UseParallelGC -Xmx512m -jar app.jar

Результаты (примерно):

GC

Minor GC

Major GC

Serial

80 мс

1200 мс

Parallel

20 мс

300 мс

Заключение

Serial GC — это «велосипед» среди сборщиков мусора:

  • Простой, надёжный, но медленный на длинных дистанциях.
🔑 Используйте его, только если:Ваш heap меньше 100 МБ,
У вас
одно ядро CPU,
Вы пишете
CLI-утилиту или embedded-приложение.

Во всех остальных случаях — выбирайте Parallel, G1 или ZGC.