首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用可用RAM在Java中有效地缓存对象?

如何使用可用RAM在Java中有效地缓存对象?
EN

Stack Overflow用户
提问于 2010-01-28 23:45:03
回答 12查看 11.1K关注 0票数 26

我需要在Java中使用任何可用RAM的一部分来缓存对象。我知道其他人也问过这个问题,但没有一个回答符合我的要求。

我的要求是:

  • 简单轻巧
  • 并不比普通的HashMap慢得多
  • 使用LRU,或一些近似LRU的删除策略。

我尝试了LinkedHashMap,但是它要求您指定最大数量的元素,我不知道它需要多少个元素来填充可用内存(它们的大小会有很大差异)。

我目前的方法是使用的MapMaker,如下所示:

代码语言:javascript
复制
Map<String, Object> cache = new MapMaker().softKeys().makeMap();

这看起来很有吸引力,因为当它需要更多的RAM时,它应该自动删除元素,但是有一个严重的问题:它的行为是填充所有可用的RAM,此时GC开始崩溃,整个应用程序的性能急剧下降。

我听说过像EHCache这样的东西,但是对于我所需要的东西,它似乎很重,而且我也不确定它对我的应用程序是否足够快(记住解决方案不能比HashMap慢得多)。

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2010-10-04 00:17:47

我有类似的要求,你-并发(在2赫斯特罗尔CPU)和LRU或类似-也尝试了番石榴MapMaker。我发现softValues()比weakValues()慢得多,但当内存被填满时,两者都使我的应用程序变得异常缓慢。

我尝试了WeakHashMap,它没有那么麻烦,甚至比通过它的removeEldestEntry()方法将LinkedHashMap作为LRU缓存的速度更快。

但是对我来说最快的是ConcurrentLinkedHashMap,它使我的应用程序3-4 (!!)比我尝试过的任何其他缓存快一倍。Joy,经过几天的挫折!显然,它已经被整合到了番石榴的MapMaker中,但是它的LRU特性无论如何都不在r07中。希望它对你有用。

票数 8
EN

Stack Overflow用户

发布于 2010-01-29 00:27:07

我已经实现了serval缓存,它可能与实现新数据源或线程池一样困难,我的建议是使用jboss或另一个众所周知的缓存库。所以你会睡得很好没有问题

票数 4
EN

Stack Overflow用户

发布于 2010-01-29 08:13:57

我听说过像EHCache这样的东西,但是对于我所需要的东西,它似乎很重,而且我也不确定它对我的应用程序是否足够快(记住解决方案不能比HashMap慢得多)。

我真的不知道是否可以说EHCache很重.至少,我不认为EHCache是这样的,特别是在使用内存存储 (它由扩展的LinkedHashMap支持,当然是最快的缓存选项)时。你应该试一试。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2158868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档