Какие бывают ссылки в Java?
В Java существуют четыре типа ссылок, которые определяют, как Garbage Collector (GC) будет обращаться с объектом, на который они указывают. Эти типы делятся по степени "жёсткости" удержания объекта в памяти:
🔒 1. Сильные ссылки (Strong References)
Это обычные, стандартные ссылки, которые мы используем в большинстве кода.
User user = new User();
🔹 Пока существует хотя бы одна сильная ссылка на объект, GC не может его удалить.
🔹 Чтобы объект стал кандидатом на удаление, все сильные ссылки на него должны исчезнуть.
2. Слабые ссылки (Weak References)
Представлены классом java.lang.ref.WeakReference<T>.
Объект со слабой ссылкой может быть удалён GC, даже если слабая ссылка ещё существует, при ближайшей сборке мусора.
WeakReference<User> weakUser = new WeakReference<>(new User());
User u = weakUser.get(); // может вернуть null, если GC уже удалил объект
📌 Используется, когда вы не хотите мешать GC удалять объект (например, в кэше, где объект можно восстановить).
3. Мягкие ссылки (Soft References)
Представлены классом java.lang.ref.SoftReference<T>.
GC удалит объект с мягкой ссылкой только если не хватает памяти.
SoftReference<User> softUser = new SoftReference<>(new User());
📌 Полезно для кэширования: объекты сохраняются до тех пор, пока хватает памяти, и удаляются при нехватке.
💀 4. Фантомные ссылки (Phantom References)
Представлены классом java.lang.ref.PhantomReference<T>.
Объект уже удалён, но ещё не убран из памяти — GC сообщает, что объект уже финализирован, но ещё не переработан.
ReferenceQueue<User> queue = new ReferenceQueue<>();
PhantomReference<User> ref = new PhantomReference<>(new User(), queue);
📌 Используются для:
-
контроля над удалением,
-
очистки ресурсов вне JVM (например, native-ресурсов),
-
мониторинга финализации.
Фантомная ссылка никогда не вернёт объект через get() — всегда null.
📊 Сравнение
Тип ссылки | Может ли GC удалить объект? | Когда используется |
---|---|---|
Strong | ❌ Нет | Обычные ссылки |
--- | --- | --- |
Soft | ✅ При нехватке памяти | Кэш, который можно очистить |
--- | --- | --- |
Weak | ✅ При любой сборке, если нет strong-ссылок | Слушатели, Map-ключи, объекты с быстрой заменой |
--- | --- | --- |
Phantom | ✅ После финализации объекта | Управление ресурсами, финализация |
--- | --- | --- |
⚠️ Где это применяется
-
WeakHashMap — использует WeakReference для ключей: записи удаляются, когда GC уничтожает ключ.
-
Обработка изображений или больших объектов — через SoftReference.
-
Фреймворки и библиотеки — для управления жизненным циклом, кэшами, утечками.
📌 Заключение
В Java есть 4 типа ссылок:
-
Сильные — обычные, полностью защищают объект от GC.
-
Мягкие — остаются до нехватки памяти.
-
Слабые — удаляются при первой возможности.
-
Фантомные — сигнализируют об окончательной "смерти" объекта.
Понимание типов ссылок помогает гибко управлять памятью, избегать утечек и строить надёжные кэш-механизмы.