Чем 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 — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки