我需要使用Java在可用内存的一部分上缓存对象。我知道其他人也提过这个问题,但是没有一个答案符合我的需求。
我的要求是:
- 简单而轻量
- 不比纯HashMap明显地慢
- 使用LRU或某种近似于LRU的删除策略
我尝试了LinkedHashMap,但它需要您指定最大元素数量,而我不知道需要多少元素才能填满可用RAM(它们的大小将有很大差异)。
我的当前方法是使用Google Collections的MapMaker如下:
Map<String, Object> cache = new MapMaker().softKeys().makeMap();
这看起来很有吸引力,因为它应该在需要更多内存时自动删除元素,然而存在一个严重的问题:它的行为是填满所有可用的内存,此时GC开始大量换页,整个应用程序的性能急剧恶化。
我听说过EHCache之类的东西,但对于我所需的东西来说似乎太重了,而且我不确定它是否足够快(记住解决方案不能比HashMap慢得多)。