WeakHashMap не спасает от утечки, если value держит ссылку на key

Идея WeakHashMap — ключи хранятся как WeakReference, и когда на key больше нет сильных ссылок снаружи, GC собирает его, а запись становится кандидатом на удаление при следующей очистке.

Ловушка: если value внутри записи хранит обратную ссылку на тот же key (или на объект, который держит key), сильная ссылка всё равно существует — просто через другой путь. GC не соберёт key, пока жив value, а value жив, пока жива запись в мапе. Круг замкнулся, память течёт так же, как с обычным HashMap.

Map cache = new WeakHashMap<>(); Key key = new Key(id); Value value = new Value(key); // хранит ссылку на key cache.put(key, value);

Спросят: «а если value не хранит key напрямую, а через список слушателей или callback — тоже течёт?» Да. Любая цепочка сильных ссылок, которая в итоге доходит от value обратно до key, держит его живым. WeakHashMap разрывает только прямую ссылку из самой мапы, а не любые ссылки в вашем графе объектов.

WeakHashMap — не универсальное решение от утечек, это инструмент для одного конкретного паттерна ссылок, и его легко сломать одной обратной ссылкой.

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

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


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