Для кэшей SoftHashMap
гораздо более уместен, чем WeakHashMap
. WeakhashMap обычно используется, когда вы хотите сохранить связь с объектом до тех пор, пока этот объект жив, но не препятствуя его восстановлению.
Напротив, SoftReference
более тесно связан с распределением памяти. См. Нет SoftHashMap? для получения подробной информации о различиях.
WeakHashMap
также обычно не подходит, так как он связан с неправильным путем для кэша - он использует слабые ключи и жесткие значения. Таким образом, ключ и значение удаляются с карты, когда сборщик мусора очищает ключ . Обычно это не то, что вам нужно для кэша - где ключи обычно являются легкими идентификаторами (например, строки или какой-то другой простой тип значения) - кэши обычно работают так, что ключ / значение восстанавливается, когда значение ссылка очищена.
В коллекциях Commons есть ReferenceMap
, где вы можете указать, какие типы ссылок вы хотите использовать для ключей и значений. Для кеша, чувствительного к памяти, вы, вероятно, будете использовать жесткие ссылки для ключей и программные ссылки для значений.
Чтобы получить семантику LRU для заданного числа ссылок N, ведите список последних N записей, извлеченных из кэша - при получении записи из кэша она добавляется в начало списка (и хвост список удален.) Чтобы убедиться, что это не удерживает слишком много памяти, вы можете создать мягкую ссылку и использовать ее в качестве триггера для удаления процента записей из конца списка. (И создайте новую мягкую ссылку для следующего триггера.)