LRU LinkedHashMap的限制大小根据可用内存(LRU LinkedHashMap tha

2019-09-02 09:37发布

我想创建LinkedHashMap中,将根据可用内存限制其大小(即当。 freeMemory + (maxMemory - allocatedMemory)低于一定阈值)。 这将被用来作为高速缓存的形式,可能使用“最近最少使用”的缓存策略。

我担心的是,虽然allocatedMemory还包括(I假设)未垃圾收集的数据,并且因此将过度估计所使用的存储器的量。 我担心的意外后果,这可能有。

例如,可以LinkedHashMap的保持删除项目,因为它认为没有足够的可用内存,但可用内存也不会增加,因为这些删除的项目不会被垃圾立即收集。

有没有人有这种类型的东西的经验吗? 是我关注的必要? 如果是这样,任何人都可以提出一个好办法?

我要补充一点,我也希望能够“锁定”的高速缓存,基本上说:“好了,从现在开始,不要删除,因为内存使用问题什么”。

Answer 1:

我知道我有偏见,但我真的要强烈推荐我们的地图制作工具这一点。 使用功能键()或softValues()功能,这取决于它是否是关键的,或者更恰当地描述了当一个条目可以清理价值GC集合。



Answer 2:

缓存往往是有问题的。 IIRC,有一个SoftCache在Sun的JRE这带来了很多问题。

无论如何,最简单的就是用SoftReference在地图秒。 这应该工作的罚款,只要开销SoftReferenceMap.Entry比缓存数据显著降低。

另外,您可以像WeakHashMap ,使用ReferenceQueue ,要么查询或者有一个线程阻塞它(例如每一个线程,可惜)。 小心同步问题。

“锁定”的地图,你可能想避免,如果必要的。 你需要保持强引用到的所有数据(如果不是空驱逐)。 这将是丑陋的。



Answer 3:

我强烈建议使用类似的Ehcache ,而不是重新发明一个缓存系统。 这是超级简单易用,配置性非常高,和伟大工程。



Answer 4:

马特乙说,类似的Ehcache或JBossCache的是一个良好的开端。

如果你想要的东西重量轻和过程,看看谷歌集合。 例如,你可以使用地图制作工具( http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/BiMap.html )制作地图/弱键和值,所以它会缓存只有那些项目有空间(虽然你不会得到LRU)。



Answer 5:

我在过去同样的需要,这是我如何实现我的缓存:

  • 有一个高速缓存管理器,它有一个最小和最大的内存限制(最大限制它的事项反正)
  • 每个注册缓存具有以下(重要的)参数:最大容量(你最有上限的时候,你不想去持有超过X项目的更多)%的内存使用情况
  • 我用LinkedHashMap中和的ReentrantReadWriteLock来保护高速缓存。
  • 每X把我计算每个条目,并触发驱逐(异步),如果计算出的内存限制>允许的内存限制的平均内存消耗。
  • 当然内存计算实际上不展示真实的内存消耗,但计算出的存储器与真实值进行比较(使用分析器),我发现,这是足够接近。

我正打算也把一个额外的保护上的缓存,如果看跌期权将会比基于内存驱逐更快的驱逐,但到现在为止我没有找到需要做到这一点。



文章来源: LRU LinkedHashMap that limits size based on available memory