Ответ
Минимальное количество ссылок на объект — одна. Ссылка создается в момент инстанцирования объекта оператором new и присваивания ее переменной.
Пример:
// В момент выполнения этой строки создается объект String в куче (heap)
// и переменной `str` присваивается ссылка на этот объект.
// У объекта ровно ОДНА ссылка.
String str = new String("Hello");
Жизненный цикл ссылок:
- Создание:
Object obj = new Object();— 1 ссылка. - Копирование ссылки:
Object anotherRef = obj;— теперь у объекта 2 ссылки. Обе переменные (objиanotherRef) указывают на один и тот же объект в памяти. - Удаление ссылок:
obj = null; // Убираем первую ссылку. У объекта еще есть ссылка `anotherRef`. anotherRef = null; // Убираем последнюю ссылку. Теперь объект недостижим.После удаления всех ссылок объект становится кандидатом на сборку мусора (garbage collection). JVM в подходящий момент освободит занимаемую им память.
Важные уточнения:
- Внутренние ссылки (поля объекта на другие объекты) не считаются при подсчете ссылок для сборщика мусора (GC). GC отслеживает только достижимость объекта от так называемых GC Roots (например, активных стеков потоков, статических полей).
- Слабые ссылки (
WeakReference) не защищают объект от сборки мусора и не учитываются как "сильные" ссылки в этом контексте.
Практический вывод: Чтобы объект был уничтожен сборщиком мусора, необходимо обнулить все сильные ссылки на него, делая объект недостижимым из любой точки активной программы.