我需要在Java中使用任何可用RAM的一部分来缓存对象。我知道其他人也问过这个问题,但没有一个回答符合我的要求。
我的要求是:
我尝试了LinkedHashMap,但是它要求您指定最大数量的元素,我不知道它需要多少个元素来填充可用内存(它们的大小会有很大差异)。
我目前的方法是使用的MapMaker,如下所示:
Map<String, Object> cache = new MapMaker().softKeys().makeMap();这看起来很有吸引力,因为当它需要更多的RAM时,它应该自动删除元素,但是有一个严重的问题:它的行为是填充所有可用的RAM,此时GC开始崩溃,整个应用程序的性能急剧下降。
我听说过像EHCache这样的东西,但是对于我所需要的东西,它似乎很重,而且我也不确定它对我的应用程序是否足够快(记住解决方案不能比HashMap慢得多)。
发布于 2010-10-04 00:17:47
我有类似的要求,你-并发(在2赫斯特罗尔CPU)和LRU或类似-也尝试了番石榴MapMaker。我发现softValues()比weakValues()慢得多,但当内存被填满时,两者都使我的应用程序变得异常缓慢。
我尝试了WeakHashMap,它没有那么麻烦,甚至比通过它的removeEldestEntry()方法将LinkedHashMap作为LRU缓存的速度更快。
但是对我来说最快的是ConcurrentLinkedHashMap,它使我的应用程序3-4 (!!)比我尝试过的任何其他缓存快一倍。Joy,经过几天的挫折!显然,它已经被整合到了番石榴的MapMaker中,但是它的LRU特性无论如何都不在r07中。希望它对你有用。
发布于 2010-01-29 00:27:07
我已经实现了serval缓存,它可能与实现新数据源或线程池一样困难,我的建议是使用jboss或另一个众所周知的缓存库。所以你会睡得很好没有问题
发布于 2010-01-29 08:13:57
我听说过像EHCache这样的东西,但是对于我所需要的东西,它似乎很重,而且我也不确定它对我的应用程序是否足够快(记住解决方案不能比HashMap慢得多)。
我真的不知道是否可以说EHCache很重.至少,我不认为EHCache是这样的,特别是在使用内存存储 (它由扩展的LinkedHashMap支持,当然是最快的缓存选项)时。你应该试一试。
https://stackoverflow.com/questions/2158868
复制相似问题