Что происходит с объектом в Java после того, как он становится недостижимым для сборщика мусора (GC)?

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

Ответ

Объект проходит через фазы цикла сборки мусора и в итоге его память освобождается.

Типичный цикл сборки мусора (на примере JVM):

  1. Marking (Пометка): GC обходит граф достижимых объектов, начиная с корневых ссылок (Garbage Collection Roots). Все непомеченные объекты считаются недостижимыми.
  2. Sweeping (Очистка): Память, занятая недостижимыми объектами, помечается как свободная.
  3. Compacting (Уплотнение) [опционально]: Выжившие объекты перемещаются в начало области памяти для борьбы с фрагментацией.

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

void someMethod() {
    Object obj = new Object(); // 1. Создан объект, есть сильная ссылка 'obj'
    // ... использование obj
} // 2. После выхода из метода локальная ссылка 'obj' уничтожается.
   // 3. Объект больше не достижим. Он будет обработан GC в следующем цикле.

Важные уточнения:

  • Время сборки не детерминировано. Объект может быть собран не сразу, а при следующем запуске GC, когда потребуется память.
  • Финализаторы (finalize()) устарели (deprecated since Java 9) и их использование не рекомендуется.
  • Разные сборщики (G1, ZGC, Shenandoah) имеют свои алгоритмы, но общая логика (достижимость → пометка → очистка) сохраняется.