Назад к вопросам
Middle
76
questionbank
Защищают ли все виды ссылок объект от удаления?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Нет, не все. Только сильные (strong) ссылки защищают объект от сборки мусора. Слабые (weak), фантомные (phantom) и мягкие (soft) ссылки этого не делают.
Вот их основные отличия:
- Сильная (Strong) ссылка: Стандартная ссылка в Java/Kotlin. Если на объект есть хотя бы одна сильная ссылка, он не будет собран сборщиком мусора. Присваивается по умолчанию.
- Мягкая (Soft) ссылка: Объект, на который ссылается мягкая ссылка, может быть собран сборщиком мусора только если JVM остро нуждается в памяти. Полезно для кеширования. Реализуется через
SoftReference. - Слабая (Weak) ссылка: Объект, на который ссылается слабая ссылка, может быть собран сборщиком мусора в любой момент, если на него нет сильных ссылок. Используется для реализации кешей, которые не блокируют сборку мусора. Реализуется через
WeakReference. - Фантомная (Phantom) ссылка: Объект, на который ссылается фантомная ссылка, уже поставлен в очередь на сборку мусора (
finalizeуже вызван или не переопределен), но еще не был полностью удален. Нужна для отслеживания процесса сборки и освобождения ресурсов. Реализуется черезPhantomReference.
Пример слабой ссылки:
// Создаем объект
Object myObject = new Object();
// Создаем слабую ссылку на объект
WeakReference<Object> weakRef = new WeakReference<>(myObject);
// Делаем сильную ссылку null, теперь объект достижим только по слабой ссылке
myObject = null;
// В какой-то момент сборщик мусора может удалить объект, если ему нужна память.
// weakRef.get() вернет null, если объект был собран.