Ответ
Weak Reference (слабая ссылка) — это один из видов ссылок в Java (java.lang.ref.WeakReference), которая не защищает свой референт (объект) от сборщика мусора (GC). Если на объект остались только слабые ссылки, GC удалит этот объект при следующем запуске, а ссылка автоматически вернет null.
Цель использования: Реализация кэшей в памяти, где данные могут быть безопасно удалены при нехватке памяти, не вызывая OutOfMemoryError. Объект в таком кэше существует, пока на него где-то еще есть "сильная" ссылка.
Пример создания и использования:
import java.lang.ref.WeakReference;
public class WeakReferenceExample {
public static void main(String[] args) {
// 1. Создаем объект и слабую ссылку на него
Object strongRef = new Object(); // "Сильная" ссылка
WeakReference<Object> weakRef = new WeakReference<>(strongRef);
System.out.println("До GC: " + weakRef.get()); // Вернет объект
// 2. Удаляем сильную ссылку. Теперь на объект ссылается только weakRef.
strongRef = null;
// 3. Запускаем сборку мусора (запрос, не гарантия)
System.gc();
// 4. Даем GC немного времени
try { Thread.sleep(100); } catch (InterruptedException e) {}
System.out.println("После GC: " + weakRef.get()); // Вернет null
}
}
Иерархия ссылок в java.lang.ref (от самой сильной к самой слабой):
- Strong Reference — обычная ссылка (
Object obj = new Object()). Объект не будет собран, пока существует такая ссылка. - Soft Reference (
SoftReference) — удаляется только при острой нехватке памяти. Подходит для кэшей, которые должны очищаться передOutOfMemoryError. - Weak Reference (
WeakReference) — удаляется при следующем запуске GC, как только пропадают сильные ссылки. - Phantom Reference (
PhantomReference) — самая слабая. Используется для точного контроля над финализацией (получения уведомления перед удалением).
Типичный use case: Ключи в WeakHashMap являются слабыми ссылками, что позволяет автоматически удалять записи из мапы, когда ключ-объект больше не используется в программе.