В Java существуют три основных типа ссылок (ссылочных переменных), которые отличаются поведением сборщика мусора:
Это наиболее распространенный тип ссылки. Объект, на который указывает сильная ссылка, не будет собран сборщиком мусора до тех пор, пока существует хотя бы одна сильная ссылка на него.
java
Мягкая ссылка указывает на объект, который может быть собран сборщиком мусора, если JVM нуждается в памяти. Объекты, на которые указывают только мягкие ссылки, гарантированно не будут собраны сборщиком мусора до тех пор, пока в JVM не возникнет острая необходимость в освобождении памяти. Обычно используется для кеширования.
java
Слабая ссылка указывает на объект, который может быть собран сборщиком мусора в любой момент, если на него не осталось сильных ссылок. Слабые ссылки часто используются для реализации кэшей, где элементы могут быть выброшены при нехватке памяти.
java
Фантомная ссылка используется в сочетании с ReferenceQueue для выполнения действий перед тем, как объект будет полностью удален из памяти. Получить объект через фантомную ссылку невозможно (get() всегда возвращает null). Используется в основном для управления ресурсами, которые требуют особой очистки.
java
Особенности и сравнение:
| Тип ссылки | Сборщик мусора | Получение объекта через get() | Использование |
|---|---|---|---|
| Strong Reference | Нет сбора | Да | Обычное использование |
| Soft Reference | Может собрать | Да (если не собран) | Кеширование (при нехватке памяти) |
| Weak Reference | Может собрать | Да (если не собран) | Кеширование (если нет сильных ссылок) |
| Phantom Reference | Может собрать | Нет (всегда null) | Очистка ресурсов перед удалением (с ReferenceQueue) |