Что такое Weak Reference (слабая ссылка) в Java?

«Что такое Weak Reference (слабая ссылка) в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 (от самой сильной к самой слабой):

  1. Strong Reference — обычная ссылка (Object obj = new Object()). Объект не будет собран, пока существует такая ссылка.
  2. Soft Reference (SoftReference) — удаляется только при острой нехватке памяти. Подходит для кэшей, которые должны очищаться перед OutOfMemoryError.
  3. Weak Reference (WeakReference) — удаляется при следующем запуске GC, как только пропадают сильные ссылки.
  4. Phantom Reference (PhantomReference) — самая слабая. Используется для точного контроля над финализацией (получения уведомления перед удалением).

Типичный use case: Ключи в WeakHashMap являются слабыми ссылками, что позволяет автоматически удалять записи из мапы, когда ключ-объект больше не используется в программе.