【问题标题】:Eclipse MAT: Finding the variable name that's causing a leakEclipse MAT:查找导致泄漏的变量名
【发布时间】: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”对象实例的详细信息。所有成员都应与对象引用一起列出。

标签: java eclipse heap-dump


【解决方案1】:

我知道它非常古老的线程。面临同样的问题。转到列表对象--> 通过传入引用,这将为您提供变量名称

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2016-01-17
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    相关资源
    最近更新 更多