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