Защищает ли наличие ссылки на объект в Java от сборки мусора (Garbage Collection)?

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

Ответ

Не всегда. Защита зависит от типа ссылки. Только сильная (strong) ссылка гарантированно предотвращает сборку мусора. Java предоставляет более слабые типы ссылок, которые GC может игнорировать.

Типы ссылок в Java и их поведение с GC:

Тип ссылки Класс Поведение при сборке мусора Назначение
Strong Object obj = new Object(); Защищает объект. GC не удалит объект, пока существует хотя бы одна сильная ссылка на него. Стандартные ссылки.
Soft SoftReference<Object> Удаляется только при нехватке памяти (перед OutOfMemoryError). Кеширование.
Weak WeakReference<Object> Удаляется при следующем цикле GC, независимо от наличия свободной памяти. Реализация канонизирующих отображений (например, WeakHashMap), кеши без утечек.
Phantom PhantomReference<Object> Удаляется после финализации. Используется для контроля за фактом удаления. Управление нативными ресурсами, точное определение момента удаления.

Пример с WeakReference:

// Создаем объект и слабую ссылку на него
Object strongRef = new Object();
WeakReference<Object> weakRef = new WeakReference<>(strongRef);

// Пока есть сильная ссылка, объект жив
System.out.println(weakRef.get()); // Не null

// Удаляем сильную ссылку
strongRef = null;
System.gc(); // "Подсказка" для GC
Thread.sleep(100); // Даем время GC

// Слабая ссылка, скорее всего, очищена
System.out.println(weakRef.get()); // null - объект собран

Вывод: Наличие ссылки не равно защите от GC. Важен её тип.