В чем разница между SoftReference, WeakReference, PhantomReference

«В чем разница между SoftReference, WeakReference, PhantomReference» — вопрос из категории Управление памятью, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

SoftReference - объект удаляется GC, когда заканчивается память. Подходит для кэширования.
WeakReference - объект удаляется при следующем GC, даже если памяти достаточно. Используется для слушателей, временных данных.
PhantomReference - объект уже удален, но позволяет выполнить финализацию перед реальным освобождением памяти.

Пример:

// SoftReference - для кэша
SoftReference<Bitmap> softCache = new SoftReference<>(bitmap);

// WeakReference - для слушателей
WeakReference<Listener> weakListener = new WeakReference<>(listener);

// PhantomReference - для финализации
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue);