我正在尝试使用 LinkedHashMap 作为本地 FIFO 缓存解决方案,覆盖其 removeEldestEntry 方法以保持大小固定:
Map lhm = new LinkedHashMap(MAX_CACHE_SIZE + 1, .75F, false) {
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_CACHE_SIZE;
}
};
但是当我不断向 map 监控进程内存中添加新条目时,我发现它一直在增长,直到使用了最大虚拟机内存,尽管 map 大小没有增加。
这是设计使然吗?如果旧值被丢弃并且 map 的大小受到限制,为什么它需要更多的内存?
更新: 根据要求,我附上了完整的代码:
@Test
public void mapMemory() {
final int MAX_CACHE_SIZE = (int) 1E3;
Map lhm = new LinkedHashMap(MAX_CACHE_SIZE + 1, 1F, false) {
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_CACHE_SIZE;
}
};
for (long i = 0; i < 1E10; i++) {
lhm.put("key_" + i, "VALUE");
}
}
最佳答案
一篇解释多线程上下文中 LinkedHashMap 内存泄漏问题的博文
https://hoangx281283.wordpress.com/2012/11/18/wrong-use-of-linkedhashmap-causes-memory-leak/
关于java - 固定大小的 LinkedHashMap 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19633320/