我需要使用可用 RAM 的一部分在 Java 中缓存对象。我知道其他人已经问过这个问题,但没有一个回答符合我的要求。
我的要求是:
- 简单轻便
- 并不比普通的 HashMap 慢很多
- 使用 LRU,或一些近似于 LRU 的删除策略
我尝试了 LinkedHashMap,但是它要求您指定最大元素数,而且我不知道填充可用 RAM 需要多少元素(它们的大小会相差很大)。
我目前的方法是使用 Google Collection 的 MapMaker,如下所示:
Map<String, Object> cache = new MapMaker().softKeys().makeMap();
这看起来很有吸引力,因为它应该在需要更多 RAM 时自动删除元素,但是有一个严重的问题:它的行为是填满所有可用的 RAM,此时 GC 开始颠簸,整个应用程序的性能急剧下降。
我听说过 EHCache 之类的东西,但对于我需要的东西来说它似乎很重,而且我不确定它对于我的应用程序是否足够快(记住该解决方案不能比 HashMap 慢得多) .