Java 固定内存映射

有没有一种简单、高效的实现,允许对映射使用的内存进行限制。Map

我的用例是,我想在创建时动态分配大部分可用内存,但我不希望在将来的任何时候。基本上,我想将此映射用作缓存,但我想避免像.我的需求很简单(最多一个LRU算法)OutOFMemoryErrorEHCache

我应该进一步澄清,我的缓存中的对象是或类似的基元,不会保存对其他对象的引用。char[]

我可以为每个条目设置最大大小的上限。


答案 1

您可以使用 LinkedHashMap 来限制 :Map

removeEldestEntry(Map.Entry<K,V> eldest):如果此地图应删除其最旧的条目,则返回。此方法由在映射中插入新条目并在之后调用。它为实现者提供了在每次添加新条目时删除最旧条目的机会。如果映射表示缓存,这将非常有用:它允许映射通过删除过时条目来减少内存消耗。trueputputAll

示例用法:此覆盖将允许映射增长到最多 100 个条目,然后在每次添加新条目时删除最旧的条目,从而保持 100 个条目的稳定状态。

private static final int MAX_ENTRIES = 100;

protected boolean removeEldestEntry(Map.Entry eldest) {
    return size() > MAX_ENTRIES;
}

相关问题


答案 2

对于缓存,a 比 .WeakhashMap 通常用于当您希望保持与某个对象的关联,只要该对象处于活动状态,但不阻止它被回收。SoftHashMapWeakHashMap

相反,a 与内存分配的关系更密切。有关差异的详细信息,请参阅 No SoftHashMap?SoftReference

WeakHashMap通常也不合适,因为它与缓存的错误方式相关联 - 它使用弱键和硬值。也就是说,当垃圾回收器清除键和值时,将从映射中删除和值。这通常不是您想要的缓存 - 其中键通常是轻量级标识符(例如字符串或其他一些简单的值类型) - 缓存通常操作,以便在清除值引用时回收键/

Commons Collections有一个RefleologyMap,您可以在其中插入您希望用于键和值的引用类型。对于内存敏感型缓存,可能会对键使用硬引用,对值使用软引用。

要获取给定数量的引用 N 的 LRU 语义,请维护从缓存中提取的最后 N 个条目的列表 - 当从缓存中检索条目时,它会添加到列表的头部(并删除列表的尾部)。若要确保这不会占用太多内存,可以创建一个软引用,并将其用作触发器,从列表末尾逐出一定比例的条目。(并为下一个触发器创建新的软引用。