Какие бывают ссылки в Java?

В Java существуют четыре типа ссылок, которые определяют, как Garbage Collector (GC) будет обращаться с объектом, на который они указывают. Эти типы делятся по степени "жёсткости" удержания объекта в памяти:

🔒 1. Сильные ссылки (Strong References)

Это обычные, стандартные ссылки, которые мы используем в большинстве кода.

User user = new User();

🔹 Пока существует хотя бы одна сильная ссылка на объект, GC не может его удалить.

🔹 Чтобы объект стал кандидатом на удаление, все сильные ссылки на него должны исчезнуть.

2. Слабые ссылки (Weak References)

Представлены классом java.lang.ref.WeakReference<T>.

Объект со слабой ссылкой может быть удалён GC, даже если слабая ссылка ещё существует, при ближайшей сборке мусора.

WeakReference&lt;User&gt; weakUser = new WeakReference<>(new User());
User u = weakUser.get(); // может вернуть null, если GC уже удалил объект

📌 Используется, когда вы не хотите мешать GC удалять объект (например, в кэше, где объект можно восстановить).

3. Мягкие ссылки (Soft References)

Представлены классом java.lang.ref.SoftReference<T>.

GC удалит объект с мягкой ссылкой только если не хватает памяти.

SoftReference&lt;User&gt; softUser = new SoftReference<>(new User());

📌 Полезно для кэширования: объекты сохраняются до тех пор, пока хватает памяти, и удаляются при нехватке.

💀 4. Фантомные ссылки (Phantom References)

Представлены классом java.lang.ref.PhantomReference<T>.
Объект уже удалён, но ещё не убран из памяти — GC сообщает, что объект уже финализирован, но ещё не переработан.

ReferenceQueue&lt;User&gt; queue = new ReferenceQueue<>();
PhantomReference&lt;User&gt; ref = new PhantomReference<>(new User(), queue);

📌 Используются для:

  • контроля над удалением,

  • очистки ресурсов вне JVM (например, native-ресурсов),

  • мониторинга финализации.

Фантомная ссылка никогда не вернёт объект через get() — всегда null.

📊 Сравнение

Тип ссылки Может ли GC удалить объект? Когда используется
Strong ❌ Нет Обычные ссылки
--- --- ---
Soft ✅ При нехватке памяти Кэш, который можно очистить
--- --- ---
Weak ✅ При любой сборке, если нет strong-ссылок Слушатели, Map-ключи, объекты с быстрой заменой
--- --- ---
Phantom ✅ После финализации объекта Управление ресурсами, финализация
--- --- ---

⚠️ Где это применяется

  • WeakHashMap — использует WeakReference для ключей: записи удаляются, когда GC уничтожает ключ.

  • Обработка изображений или больших объектов — через SoftReference.

  • Фреймворки и библиотеки — для управления жизненным циклом, кэшами, утечками.

📌 Заключение

В Java есть 4 типа ссылок:

  1. Сильные — обычные, полностью защищают объект от GC.

  2. Мягкие — остаются до нехватки памяти.

  3. Слабые — удаляются при первой возможности.

  4. Фантомные — сигнализируют об окончательной "смерти" объекта.

Понимание типов ссылок помогает гибко управлять памятью, избегать утечек и строить надёжные кэш-механизмы.