Middle
74
questionbank

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

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

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

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

  • Присваивается обычным способом.
  • Объект, на который ссылается сильная ссылка, не будет собран сборщиком мусора, пока на него есть хотя бы одна сильная ссылка.
java

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

  • Объект, на который ссылается мягкая ссылка, может быть собран сборщиком мусора только в том случае, если системе не хватает памяти.
  • Часто используются для реализации кэшей.
java

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

  • Объект, на который ссылается слабая ссылка, может быть собран сборщиком мусора в любой момент, как только на него не останется сильных ссылок.
  • Используются для предотвращения утечек памяти, например, при хранении слушателей или контекстов.
java

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

  • Объект, на который ссылается призрачная ссылка, не будет собран сборщиком мусора до тех пор, пока все призрачные ссылки на него не будут очищены.
  • Нельзя получить доступ к объекту через get().
  • Используются в сочетании с ReferenceQueue для выполнения действий после того, как объект становится доступным для сборки, но до того, как память будет фактически освобождена. Применяются для более сложного управления ресурсами, чем с использованием метода finalize().
java

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

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