Ответ
Не всегда. Защита зависит от типа ссылки. Только сильная (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. Важен её тип.