Что происходит при запуске сборщика мусора (Garbage Collector) в JVM?

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

Ответ

Сборка мусора (GC) — это процесс автоматического освобождения памяти, занятой недостижимыми объектами. Основные фазы (могут отличаться в зависимости от сборщика):

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

Пример создания мусора:

public void createGarbage() {
    Object obj = new Object(); // 1. Создан объект
    // obj является достижимой ссылкой
    obj = null; // 2. Ссылка обнулена, исходный объект теперь недостижим
    // Объект готов к сборке мусором
}

Важные моменты:

  • System.gc() — лишь предложение JVM запустить GC, выполнение не гарантировано.
  • Типы сборщиков (Serial, Parallel, G1, ZGC, Shenandoah) определяют алгоритм (mark-sweep-compact, copying, concurrent marking) и влияют на паузы (stop-the-world).
  • Best practice: Не полагаться на System.gc(). Управлять производительностью GC через JVM-флаги (напр., -XX:+UseG1GC) и анализ дампов памяти.