Мне нужно кэшировать объекты в Java, используя часть доступной оперативной памяти. Я знаю, что другие задавали этот вопрос, но ни один из ответов не отвечает моим требованиям.
Мои требования:
- Простой и легкий
- Не намного медленнее, чем обычный HashMap
- Использовать LRU или некоторую политику удаления, которая приближается к LRU
Я попробовал LinkedHashMap, однако он требует, чтобы вы указали максимальное количество элементов, и я не знаю, сколько элементов потребуется для заполнения доступной оперативной памяти (их размеры будут значительно различаться).
Мой текущий подход заключается в использовании MapMaker из Google Collection следующим образом:
Map<String, Object> cache = new MapMaker().softKeys().makeMap();
Это показалось привлекательным, поскольку он должен автоматически удалять элементы, когда ему требуется больше оперативной памяти, однако существует серьезная проблема: его поведение заключается в заполнении всей доступной оперативной памяти, после чего ГХ начинает работать, а производительность всего приложения резко ухудшается. .
Я слышал о таких вещах, как EHCache, но он кажется достаточно тяжелым для того, что мне нужно, и я не уверен, достаточно ли он быстр для моего приложения (помня, что решение не может быть значительно медленнее, чем HashMap).