是否可以在堆转储中查看来自hprof dump / threads的线程

时间:2012-09-12 05:05:49

标签: java heap-dump hprof eclipse-mat

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

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

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

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

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

7 个答案:

答案 0 :(得分:12)

回答自己的问题。积分转到@ RC

  1. 使用visualvm打开转储。这需要一段时间。
  2. 点击“堆转储时的线程”
  3. visual vm with threads at heapdump

答案 1 :(得分:5)

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

  

主题概述

     

要获得堆转储中所有线程的概述,请使用工具栏中的“线程概述”按钮,如下图所示。或者,可以使用查询浏览器>线程概述和堆栈查询:

screenshot of toolbar icon

答案 2 :(得分:0)

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

答案 3 :(得分:0)

Eclipse MAT允许您在Leak suspects报告中查看可疑线程。在应用程序命名空间中查找具有行号的类,以查找它们在堆中占用的内存量。这会给你一些泄漏的课程。

答案 4 :(得分:0)

你可以杀死-3进程id以获得标准输出的线程转储。这不会杀死java进程,因此您可以根据需要多次执行此操作。

作为RC声明,visualVM是一个很好的工具,可以按类类型和各种图形和分析工具为您提供对象计数。

答案 5 :(得分:0)

使用visualvm。

尝试在perm堆空间超过时分析图表... 你还应该查看内存样本&保存它的快照..

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

答案 6 :(得分:-1)

要启用您需要的选项+并关闭您需要的选项-

文档令人困惑的是它显示了默认设置,使其“清除”您已经设置的内容。带+的那些默认情况下处于启用状态,而带有 - 的处于默认状态。这意味着如果您从文档中复制任何+或 - 选项,它们应该什么都不做(除非默认值随时间发生变化)

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

-XX:+ HeapDumpOnOutOfMemoryError打开堆转储。