能否从hprof dump / heap dump 中查看线程?

9
我有一个大型(5GB)的hprof转储文件,是当应用程序发生OutOfMemoryError时创建的。(使用XX: HeapDumpOnOutOfMemoryError)。不幸的是,在此错误发生时没有收集到任何日志。重新创建将需要几个小时。如果有一些工具可以从hprof中显示异常堆栈跟踪或所有线程堆栈等信息,那就更好了。
我目前正在使用MAT,但无法找到获取线程信息的方法。我应该使用哪个工具?
(我不确定hprof文件是否包含OOM发生时的线程信息/调用位置。)
(我知道如何在正常情况下拍摄线程转储。问题是事件已经发生,我只有hprof转储文件。)

1
试试visualvm(http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/threads.html)。 - user180100
堆转储不包含线程信息。您应该查看线程转储。 - Bharat Sinha
@ RC。是的,使用VisualVM加载了hprof,并且它有显示线程转储的选项。您可以将其标记为答案吗? - Jayan
7个回答

12

回答自己的问题。鸣谢@RC

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

显示带有堆转储中线程的VisualVM


据https://dev59.com/OXA65IYBdhLWcg3wuRF8#11903624所述,这是堆转储格式的“新”功能(日期接近2010年)。 - gavenkoa
1
长期以来,这一直是答案。现在MAT已经改进了报告...请参见@matt b的答案:https://dev59.com/hGjWa4cB1Zd3GeqPpli5#41243806 - Jayan

9

MAT现在可以直接显示线程了(可能是自从提出这个问题以来添加的)。

线程概述

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

screenshot of toolbar icon


终于得到了我问题的实际答案 :) - Jayan
3
所有堆栈跟踪(附加一些信息)也在MAT解析目录中的.threads文件中。 - Jarek Przygódzki
有人知道是否可以将这些以常见的线程转储格式导出,就像使用kill -3jstack命令得到的那样吗?我们查看了.threads文件,但在我们用于分析这些文件的程序中,它并没有被解析为标准的线程转储格式。 - undefined

0

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


0
Eclipse MAT允许您在泄漏嫌疑报告中查看可疑线程。通过查找应用程序命名空间中的类及其行号,可以确定它们在堆中占用的内存量,从而找出可能存在内存泄漏的类。

0
你可以使用 kill -3 命令杀死进程 ID 并将线程转储到标准输出。这不会杀死 Java 进程,因此你可以随意执行此操作。
正如 RC 所述,visualVM 是一个很好的工具,可以根据类类型给出对象计数和各种图形和分析工具。

0

使用VisualVM。

当Perm Heap空间超过时,尝试分析图表...您还应该检查内存样本并保存其快照。

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


-1

要打开一个选项,您需要使用+,要关闭一个选项,您需要使用-

文档中令人困惑的是,它显示默认设置以使其“清晰”,以便您已经了解设置。 带有+的选项默认为打开状态,带有-的选项默认为关闭状态。 这意味着,如果您从文档中复制任何+或-选项,则它们不应执行任何操作(除非默认值随时间而改变)

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

-XX:+HeapDumpOnOutOfMemoryError打开堆转储。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接