Сократите использование памяти С помощью WeakHashMap
-
20-09-2019 - |
Вопрос
В Javadoc of WeakHashMap.html, в нем говорилось
"Каждый ключевой объект в WeakHashMap хранится косвенно как референт слабой ссылки.Следовательно, ключ будет автоматически удален только после того, как слабые ссылки на него, как внутри , так и за пределами карты, будут удалены сборщиком мусора. "
А потом
Обратите внимание, что объект value может ссылаться косвенно на свой ключ через саму WeakHashMap;то есть объект value может сильно ссылаться на некоторый другой ключевой объект, связанный с которым объект value, в свою очередь, сильно ссылается на ключ первого объекта value.
Но не следует ли использовать как ключ, так и Значение weak reference в WeakHashMap?т. е.если памяти мало, GC освободит память, удерживаемую объектом value (поскольку объект value, скорее всего, в большинстве случаев занимает больше памяти, чем объект key)?
И если GC освободит объект Value, ключевой объект также может быть свободным?
По сути, я ищу HashMap, который уменьшит использование памяти при нехватке памяти (GC собирает значения и ключевые объекты, если это необходимо).
Возможно ли это на Java?
Спасибо.
Решение
Слабые ссылки неуместны для кэшей - NetBeans делает это и может привести к глупости.
SoftReference
это то, чего ты хочешь.На самом деле довольно сложно сделать это правильно - поэтому скопируйте чье-нибудь другое решение.Некоторые люди советуют явно управлять кэшами самостоятельно.
Reference
s работают только с одной ссылкой.Было предложение добавить "эфемероны" в Java SE, но я не видел, чтобы реализация с этим что-то меняла.
Другие советы
Идея заключается в том, что вы можете использовать эту карту как структуру данных "поиска", которая поддерживает только пары ключ-значение, на которые все еще можно ссылаться (через ключ).Тем не менее, хотя основная идея приятна, я помню, что она оказалась не такой полезной, как я надеялся.