Чем WeakReference отличается от SoftReference и PhantomReference

Вопрос проверяет не знание трёх названий, а понимание того, в какой момент жизненного цикла объекта GC разрешает узнать о его смерти.

WeakReference не мешает сборке объекта вообще. Как только не осталось strong-ссылок, объект собирается на ближайшем цикле GC, даже если памяти достаточно. Классика применения — WeakHashMap, где ключ не должен жить дольше своего реального использования.

SoftReference держит объект живым дольше: GC очищает его, только когда действительно не хватает памяти, ближе к границе heap. Порядок и момент очистки не гарантированы — рассчитывать на предсказуемое поведение под нагрузкой не стоит.

PhantomReference — особый случай. Метод get() у него всегда возвращает null, объект уже недостижим в момент постановки в очередь. Ссылка используется не чтобы прочитать объект, а чтобы узнать точный момент, когда финализация закончилась и можно освободить внешний ресурс.

public class Resource implements AutoCloseable {

private final Cleaner.Cleanable cleanable;

public Resource(Cleaner cleaner) { this.cleanable = cleaner.register( this, this::releaseNative); }

private void releaseNative() { // освобождение ресурса }

@Override public void close() { cleanable.clean(); } }

Дальше обычно спрашивают про ReferenceQueue: как достать освобождённые ссылки из очереди и почему Cleaner API в Java 9+ считается безопасной заменой finalize(). Ждут ответ про то, что finalize() не гарантирует момент вызова и может вообще не сработать при завершении JVM, а Cleaner работает через отдельный поток и ту же PhantomReference-механику.

Уровень ссылки — это не сила привязки объекта к памяти, а контракт: когда именно GC разрешает тебе узнать, что объект мёртв.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки