【问题标题】:Is it possible to view threads from hprof dump / threads in heap dump是否可以从 hprof 转储/堆转储中的线程中查看线程
【发布时间】:2012-09-12 05:05:48
【问题描述】:

我有一个大型 (5GB) hprof 转储,由应用程序在OutOfMemoryError 发生时创建。 (使用XX: HeapDumpOnOutOfMemoryError)。

很遗憾,发生此错误时没有收集任何日志。重新创建这将需要几个小时。我希望某些工具可以显示来自 hprof 的异常堆栈跟踪或所有线程堆栈等。

我目前正在使用MAT,看不到获取线程信息的方法。我可以使用哪个工具?

(我不确定 hprof 文件是否有关于 OOM 发生时调用的线程/位置的信息)。

(我知道在正常情况下如何进行线程转储。这里的问题是事件已经发生了,我只有 hprof 转储。)

【问题讨论】:

标签: java heap-dump hprof eclipse-mat


【解决方案1】:

回答自己的问题。归功于@ RC

  1. 使用 visualvm 打开转储。这需要一段时间。
  2. 点击“堆转储线程”

【讨论】:

【解决方案2】:

MAT 可以show the threads directly now(可能是在提出问题后添加的)。

线程概览

要获得堆转储中所有线程的概览,请使用工具栏中的“线程概览”按钮,如下图所示。或者,可以使用 Query Browser > Thread Overview and Stacks 查询:

【讨论】:

  • !!最后是我的问题的实际答案:)
  • 此外,所有堆栈跟踪(带有一些附加信息)都在 MAT 解析目录中的 .threads 文件中
【解决方案3】:

我不认为堆转储包含除 GC root 之外的线程信息。如果需要线程相关信息,还需要进行线程转储。

【讨论】:

    【解决方案4】:

    Eclipse MAT 允许您在泄漏嫌疑人报告中查看可疑线程。在应用程序命名空间中查找类及其行号,以了解它们在堆中占用了多少内存。这会给你一些泄漏类的提示。

    【讨论】:

      【解决方案5】:

      您可以杀死 -3 进程 ID 以将线程转储到标准输出。这不会杀死 java 进程,因此您可以根据需要执行多次。

      正如 RC 所说,visualVM 是一个很好的工具,它可以按类类型为您提供对象计数以及各种图形和分析工具。

      【讨论】:

        【解决方案6】:

        使用可视化虚拟机。

        当 perm heap space 超出时尝试分析图形... 你还应该检查内存样本并保存它的快照..

        分析线程堆栈...将帮助您缩小问题范围。

        【讨论】:

          【解决方案7】:

          打开您需要的选项+ 并关闭您需要的选项-

          文档令人困惑的是,它显示了默认设置,以便“清楚”您已经拥有什么设置。带 + 的默认开启,带 - 的默认关闭。这意味着如果您从文档中复制任何 + 或 - 选项,它们不应执行任何操作(除非默认值随时间发生变化)

          -XX:-HeapDumpOnOutOfMemoryError 关闭堆转储,这是默认设置。

          -XX:+HeapDumpOnOutOfMemoryError 开启堆转储。

          【讨论】:

            猜你喜欢
            • 2014-09-12
            • 1970-01-01
            • 1970-01-01
            • 2010-11-20
            • 2017-11-03
            • 2017-11-17
            • 1970-01-01
            • 2019-12-02
            • 2012-11-03
            相关资源
            最近更新 更多