Назад к вопросам
Middle
104
questionbank

Какие существуют виды ссылок в Java и в чём их отличия?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В Java существуют сильные (strong), мягкие (soft), слабые (weak) и призрачные (phantom) ссылки.

Сильная ссылка:

  • Присваивается обычным способом.
  • Объект, на который ссылается сильная ссылка, не будет собран сборщиком мусора, пока на него есть хотя бы одна сильная ссылка.
Object obj = new Object(); // сильная ссылка

Мягкая ссылка (SoftReference):

  • Объект, на который ссылается мягкая ссылка, может быть собран сборщиком мусора только в том случае, если системе не хватает памяти.
  • Часто используются для реализации кэшей.
SoftReference<Object> softRef = new SoftReference<>(new Object());
Object obj = softRef.get(); // может вернуть null, если объект был собран

Слабая ссылка (WeakReference):

  • Объект, на который ссылается слабая ссылка, может быть собран сборщиком мусора в любой момент, как только на него не останется сильных ссылок.
  • Используются для предотвращения утечек памяти, например, при хранении слушателей или контекстов.
WeakReference<Object> weakRef = new WeakReference<>(new Object());
Object obj = weakRef.get(); // может вернуть null в любой момент

Призрачная ссылка (PhantomReference):

  • Объект, на который ссылается призрачная ссылка, не будет собран сборщиком мусора до тех пор, пока все призрачные ссылки на него не будут очищены.
  • Нельзя получить доступ к объекту через get().
  • Используются в сочетании с ReferenceQueue для выполнения действий после того, как объект становится доступным для сборки, но до того, как память будет фактически освобождена. Применяются для более сложного управления ресурсами, чем с использованием метода finalize().
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), referenceQueue);
// phantomRef.get() всегда вернет null

Основные отличия представлены в таблице:

Тип ссылки Критерий сборки мусора Возможность получить объект через get() Применение
Сильная Только если нет сильных ссылок Да Обычное использование
Мягкая Если не хватает памяти Да (может быть null) Кэши
Слабая Если нет сильных ссылок Да (может быть null) Предотвращение утечек памяти (слушатели, контексты)
Призрачная После очистки всех призрачных ссылок (в сочетании с ReferenceQueue) Нет (всегда null) Продвинутое управление ресурсами, замена finalize()