java - 固定大小的 LinkedHashMap 内存泄漏?

标签 java caching memory-leaks linkedhashmap

我正在尝试使用 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/

相关文章:

c - 禁用 DCache 将阻止设置atomic_flag

c++ - 如何删除指针的 STL 列表?

angularjs - 如何使用 angularjs-nvd3-directives 避免内存泄漏

php - Yii CRedisCache.php 将使用哪种 redis 数据类型进行缓存存储?

nhibernate - Strict vs NonStrict NHibernate 缓存并发策略

c - 返回指针时发生内存泄漏

java - 如何获取 Eclipse DOM 插件开发类的 Javadocs?

java - JTabbedPane 自定义选项卡外观

java - 为 Kotlin 创建 POJO 类

java - 如何使用 JDBC 从远程计算机访问 WAMP 数据库?