Сократите использование памяти С помощью WeakHashMap

StackOverflow https://stackoverflow.com/questions/2473410

Вопрос

В Javadoc of WeakHashMap.html, в нем говорилось

"Каждый ключевой объект в WeakHashMap хранится косвенно как референт слабой ссылки.Следовательно, ключ будет автоматически удален только после того, как слабые ссылки на него, как внутри , так и за пределами карты, будут удалены сборщиком мусора. "

А потом

Обратите внимание, что объект value может ссылаться косвенно на свой ключ через саму WeakHashMap;то есть объект value может сильно ссылаться на некоторый другой ключевой объект, связанный с которым объект value, в свою очередь, сильно ссылается на ключ первого объекта value.

Но не следует ли использовать как ключ, так и Значение weak reference в WeakHashMap?т. е.если памяти мало, GC освободит память, удерживаемую объектом value (поскольку объект value, скорее всего, в большинстве случаев занимает больше памяти, чем объект key)?

И если GC освободит объект Value, ключевой объект также может быть свободным?

По сути, я ищу HashMap, который уменьшит использование памяти при нехватке памяти (GC собирает значения и ключевые объекты, если это необходимо).

Возможно ли это на Java?

Спасибо.

Это было полезно?

Решение

Слабые ссылки неуместны для кэшей - NetBeans делает это и может привести к глупости.

SoftReference это то, чего ты хочешь.На самом деле довольно сложно сделать это правильно - поэтому скопируйте чье-нибудь другое решение.Некоторые люди советуют явно управлять кэшами самостоятельно.

References работают только с одной ссылкой.Было предложение добавить "эфемероны" в Java SE, но я не видел, чтобы реализация с этим что-то меняла.

Другие советы

Идея заключается в том, что вы можете использовать эту карту как структуру данных "поиска", которая поддерживает только пары ключ-значение, на которые все еще можно ссылаться (через ключ).Тем не менее, хотя основная идея приятна, я помню, что она оказалась не такой полезной, как я надеялся.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top