Немного поздно, но вот соответствующий пример использования:
Мне нужно кэшировать два типа объектов: большие (десериализованные) файлы данных, загрузка которых занимает 10 минут, и стоит 15 ГБ оперативной памяти каждый, и меньшие (динамически скомпилированные) объекты, которые содержат внутренние ссылки на эти файлы данных (меньшие объекты также кэшируются, потому что они генерируют ~ 10 с). Эти кэши скрыты на фабриках, поставляющих объекты (первый компонент не знает о последних), и имеют разные политики выселения.
Когда мой кэш `data file 'высвобождает объект, он заменяет его слабой ссылкой, поэтому, если этот объект все еще доступен при следующем запросе, мы можем воскресить его (и возобновить тайм-аут его кэша). Таким образом, мы избегаем потери (или случайного дублирования) любого объекта до того, как он действительно перестанет существовать (то есть не используется где-либо еще). Обратите внимание, что ни один из кешей не обязан знать о другом, и что никакие другие клиентские объекты не должны знать, что вообще существуют какие-либо кеши (например: нам не нужны области «keepalive», обратные вызовы, регистрация, получение и возврат). и т. д. - все становится намного проще).
Таким образом, хотя использование WeakReference само по себе (вместо кэша) является ужасной идеей (поскольку современные GC обычно настроены на размер кэша ЦП L2, и обычный код будет проходить через это много раз в минуту), это очень полезен как способ скрыть ваших кешей от остальной части вашего кода.