【发布时间】:2017-03-07 23:30:00
【问题描述】:
我有一个包含少量 ConcurrentHashMap 的单例对象,其中一个导致内存泄漏(即它占用了 2GB 堆的 99.5%)。有没有办法使用 Eclipse MAT(或其他堆转储分析工具)确定不同哈希映射的变量名称?例如。在这种情况下,类是
class ABunchOfMaps {
ConcurrentMap<Long, String> map1 = new ConcurrentHashMap<>();
ConcurrentMap<Long, String> map2 = new ConcurrentHashMap<>();
ConcurrentMap<Long, String> map3 = new ConcurrentHashMap<>();
}
有没有办法确定是 map1、map2 还是 map3 导致了泄漏?我所能做的就是获取地图的地址,而不是它们的名字。我正在使用独立的 eclipse 内存分析器,版本 1.6.1。
【问题讨论】:
-
你不能在单独的预定线程中记录尺寸吗?
-
您检查过“泄漏嫌疑人”页面吗?这应该显示根对象。这些类是否在没有调试信息的情况下编译?
-
@Konrad 泄漏嫌疑人页面告诉我 ABunchOfMaps 是根对象,泄漏是由 ConcurrentHashMap 引起的,但它没有给出地图的名称pasteboard.co/GJiAoZme4.png
-
尽管如此,它没有理由只是其中一张地图。我真的认为一个简单的日志行可以在这里提供帮助。它并没有真正回答问题,但有助于调查问题
-
@Zim-Zam 你查看详情页了吗?如果我检查堆转储,我会看到成员。您可能会记住参考并检查“ABunchOfMaps”对象实例的详细信息。所有成员都应与对象引用一起列出。