Что происходит с объектом в Java, когда на него больше не ссылается ни одна переменная?

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

Ответ

Такой объект становится недостижимым (unreachable) и помечается как пригодный для сборки мусора (Garbage Collection, GC).

Как объект становится недостижимым:

  1. Переменная, указывающая на объект, выходит из области видимости.
  2. Переменной присваивается значение null или ссылка на другой объект.
  3. Объект остается только в изолированном цикле ссылок (circular reference), недоступном из "корней" (GC Roots).

Пример:

public class GCDemo {
    public static void main(String[] args) {
        // 1. Создается объект, на который ссылается `obj`
        Object obj = new Object();
        // 2. Ссылка перенаправляется, старый объект становится недостижимым
        obj = new Object();
        // 3. Здесь уже два объекта-кандидата на GC
        obj = null;
        // 4. Явный запрос на сборку мусора (НЕ гарантирует немедленного выполнения)
        System.gc();
    }
}

Важные детали:

  • Время сборки не определено. JVM сама решает, когда запустить сборщик мусора. Вызов System.gc() является лишь рекомендацией.
  • Процесс сборки: Сборщик мусора находит недостижимые объекты, освобождает занимаемую ими память и при необходимости вызывает метод finalize() (устарел с Java 9).
  • Корни сборки мусора (GC Roots): Статические переменные, активные потоки, локальные переменные в стеке, JNI-ссылки — точки, от которых начинается проверка достижимости.