Уменьшите использование памяти с WeakHashMap - PullRequest
1 голос
/ 19 марта 2010

В Javadoc WeakHashMap.html сказано

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

А потом

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

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

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

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

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 19 марта 2010

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

1 голос
/ 19 марта 2010

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

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

Reference с работают только с одной ссылкой. Было предложение добавить «эфемероны» в Java SE, но я нигде не видел, чтобы реализация шла так далеко.

...