Какое минимальное количество ссылок может быть у объекта в Java?

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

Ответ

Минимальное количество ссылок на объект — одна. Ссылка создается в момент инстанцирования объекта оператором new и присваивания ее переменной.

Пример:

// В момент выполнения этой строки создается объект String в куче (heap)
// и переменной `str` присваивается ссылка на этот объект.
// У объекта ровно ОДНА ссылка.
String str = new String("Hello");

Жизненный цикл ссылок:

  1. Создание: Object obj = new Object(); — 1 ссылка.
  2. Копирование ссылки: Object anotherRef = obj; — теперь у объекта 2 ссылки. Обе переменные (obj и anotherRef) указывают на один и тот же объект в памяти.
  3. Удаление ссылок:
    obj = null;      // Убираем первую ссылку. У объекта еще есть ссылка `anotherRef`.
    anotherRef = null; // Убираем последнюю ссылку. Теперь объект недостижим.

    После удаления всех ссылок объект становится кандидатом на сборку мусора (garbage collection). JVM в подходящий момент освободит занимаемую им память.

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

  • Внутренние ссылки (поля объекта на другие объекты) не считаются при подсчете ссылок для сборщика мусора (GC). GC отслеживает только достижимость объекта от так называемых GC Roots (например, активных стеков потоков, статических полей).
  • Слабые ссылки (WeakReference) не защищают объект от сборки мусора и не учитываются как "сильные" ссылки в этом контексте.

Практический вывод: Чтобы объект был уничтожен сборщиком мусора, необходимо обнулить все сильные ссылки на него, делая объект недостижимым из любой точки активной программы.