Strong, Weak, Soft, and Phantom References
-
Strong Reference
Это тип ссылки по умолчанию. Любой объект, имеющий активную сильную ссылку, не подлежит сборке мусора.
MyClass obj = new MyClass ();Объект удаляется сборщиком мусора только тогда, когда переменная, на которую была сделана сильная ссылка, указывает на null.
obj = null; //'obj' больше не ссылается на экземпляр. Таким образом, 'MyClass' теперь доступен для сборки мусора. -
Soft Reference
объект с Soft Reference даже если свободен для сборки мусора, он всё равно не будет удалён сборщиком мусора, пока JVM остро не потребуется память. Объекты удаляются из памяти, когда у JVM заканчивается память.
// Если у тебя есть объект: Object obj = new Object(); // И ты оборачиваешь его в SoftReference: SoftReference<Object> softRef = new SoftReference<>(obj); obj = null; // Получить объект можно так: Object value = softRef.get(); // Если GC уже удалил объект → вернётся **null** -
Weak Reference
WeakReferenceиспользуется для объектов, которые должны быть удалены сразу, как только на них не остаётся strong-ссылок.Object obj = new Object(); // strong reference WeakReference<Object> weak = new WeakReference<>(obj); obj = null; // убрали strong reference // осталась только weak-ссылка // объект становится кандидатом на удаление weak.get(); // может вернуть объект или nullWeakReferenceнапример используется вWeakHashMap -
Phantom Reference
Это
НЕ ссылкадля работы с объектом, аДАТЧИК СМЕРТИобъектаИспользуется для очистки всяких ресурсов, которые не контролируются GC.
// Шаг 1 — создаёшь очередь ReferenceQueue<MyObject> queue = new ReferenceQueue<>(); // Шаг 2 — создаёшь PhantomReference PhantomReference<MyObject> ref = new PhantomReference<>(obj, queue); // Шаг 3 — убираешь strong reference obj = null; // Шаг 4 — GC делает магию: // Когда GC приходит: // 1) видит, что объект больше не reachable // 2) помечает его как **phantom reachable** // 3) кладёт ref в очередь // Шаг 5 — ты ловишь событие Reference<?> ref = queue.poll(); if (ref != null) { // объект умер → чистим ресурсы }phantomRef.get() == nullВСЕГДА NULL!Класс
ReferenceQueueпредоставляет два метода для опроса очереди:remove()- блокирует выполнение, когда очередь пустая и до тех пор, пока не в очереди не появится элемент для возращенияpoll()- который не блокирует выполнение, и немедленно возвращает null, когда очередь пустая.