Потребность в WeakReferences возникает из сценария, в котором вам нужно поддерживать метаданные об объекте, который вы не контролируете.
Придуманный пример будет String
, он окончательный, и мы не можем его расширить, но если мы хотим сохранить некоторые дополнительные данные о конкретном экземпляре String
, мы, вероятно, будем использовать реализацию Map
, которая будет держать эти метаданные. В этом примере я предложу сохранить длину строки в качестве наших метаданных (да, я знаю, что объект String
уже имеет публичное свойство длины). Таким образом, мы создали бы Map
как это:
Map<String, Integer> stringLengths = new HashMap<String, Integer>();
Предположим, что мы можем заполнить эту карту каким-либо методом и не знать, когда мы закончим с данными, поэтому мы не можем явно удалить записи. Поскольку мы заполняем эту карту, которая никогда не будет заселена, наши ссылки будут сохраняться навсегда. Если приложение выполняется в течение длительного времени, есть большая вероятность, что мы столкнемся с OutOfMemoryError.
Решением этой проблемы было бы использование WeakHashMap
реализации.
Map<String, Integer> stringLengths = new WeakHashMap<String, Integer>();
Таким образом, когда все (сильные) ссылки на ключ исчезнут, следующий GC вызовет удаление записи WeakHashMap
. (Да, я понимаю, что String
занимает особое место в сердце JVM, но я предполагаю, что строки - это GC так же, как обычный объект в этом надуманном примере)
Если это подход, который вы используете в своем приложении (хранение ваших растровых изображений на глобальной карте), я думаю, что это определенно то, на что стоит обратить внимание.