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

Какие существуют виды ссылок в Java и их особенности?

Sobes Copilot

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

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

sobes.tech AI

В Java существуют три основных типа ссылок (ссылочных переменных), которые отличаются поведением сборщика мусора:

  • Strong Reference (Сильная ссылка)
  • Soft Reference (Мягкая ссылка)
  • Weak Reference (Слабая ссылка)
  • Phantom Reference (Фантомная ссылка)

Strong Reference (Сильная ссылка)

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

// Создание объекта и сильной ссылки на него
Object myObject = new Object(); 

Soft Reference (Мягкая ссылка)

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

import java.lang.ref.SoftReference;

// Создание объекта
Object data = new Object(); 
// Создание мягкой ссылки на объект
SoftReference<Object> softRef = new SoftReference<>(data); 

// Объект data может быть собран сборщиком мусора, если памяти не хватает
// Если объект не был собран, его можно получить обратно
Object retrievedData = softRef.get(); 

Weak Reference (Слабая ссылка)

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

import java.lang.ref.WeakReference;

// Создание объекта
Object cacheEntry = new Object(); 
// Создание слабой ссылки на объект
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry); 

// Объект cacheEntry может быть собран сборщиком мусора в любой момент
// Проверка, был ли объект собран
if (weakRef.get() == null) { 
    // Объект был собран
}

Phantom Reference (Фантомная ссылка)

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

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

// Создание объекта для отслеживания
Object resource = new Object(); 
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>(); 
// Создание фантомной ссылки и связывание её с очередью
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue); 

// В отдельном потоке можно отслеживать очередь riferimentoQueue
// Когда объект resource будет готов к окончательному удалению, фантомная ссылка появится в очереди

Особенности и сравнение:

Тип ссылки Сборщик мусора Получение объекта через get() Использование
Strong Reference Нет сбора Да Обычное использование
Soft Reference Может собрать Да (если не собран) Кеширование (при нехватке памяти)
Weak Reference Может собрать Да (если не собран) Кеширование (если нет сильных ссылок)
Phantom Reference Может собрать Нет (всегда null) Очистка ресурсов перед удалением (с ReferenceQueue)