Как работает процесс сборки мусора (Garbage Collection) в Java?

«Как работает процесс сборки мусора (Garbage Collection) в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Garbage Collection (GC) — это автоматический процесс управления памятью в JVM. Его основная задача — найти и освободить память, занятую объектами, которые больше не используются программой.

Базовый цикл сборки мусора (на примере алгоритма Mark-Sweep-Compact):

  1. Mark (Пометка): Определяются все живые объекты, достижимые из GC Roots.
  2. Sweep (Очистка): Память сканируется, и пространство, занятое "мертвыми" (непомеченными) объектами, помечается как свободное.
  3. Compact (Уплотнение - опционально): Живые объекты перемещаются в начало области памяти, чтобы устранить фрагментацию и упростить выделение памяти под новые объекты одним непрерывным блоком.

Пример жизненного цикла объекта:

// 1. Выделение памяти в Young Generation (Eden Space)
String data = new String("Sample");
// 2. Объект используется...
// 3. Ссылка теряется
data = null;
// 4. При следующем Minor GC объект будет определен как мусор и его память освобождена.

Типы сборщиков мусора в Java (выбор через JVM флаги):

  • Serial GC: Однопоточный, для приложений с маленькой кучей и нечувствительных к паузам.
  • Parallel/Throughput GC: Многопоточный, максимизирует пропускную способность (throughput), используя несколько потоков для сборки.
  • CMS (Concurrent Mark Sweep): Старая реализация, aiming to minimize pauses by doing most work concurrently with application threads (deprecated).
  • G1 (Garbage-First): Параллельный, concurrent и incremental сборщик с предсказуемыми паузами, разделяющий кучу на регионы.
  • ZGC / Shenandoah: Сборщики нового поколения, цель которых — сверхнизкие паузы (менее 10 мс) даже для очень больших куч (терабайты).