9

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

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

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

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

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

4

7 回答 7

12

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

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

具有堆转储线程的可视虚拟机

于 2012-09-12T06:53:37.633 回答
8

MAT现在可以直接显示线程(也许这是在提出问题后添加的)。

线程概述

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

工具栏图标的屏幕截图

于 2016-12-20T13:44:07.317 回答
0

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

于 2012-09-12T05:07:52.120 回答
0

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

于 2012-09-12T05:26:03.777 回答
0

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

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

于 2012-09-12T05:27:54.290 回答
0

使用视觉虚拟机。

当 perm 堆空间超过时尝试分析图形...您还应该检查内存样本并保存其快照..

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

于 2012-09-12T06:40:29.943 回答
-1

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

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

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

-XX:+HeapDumpOnOutOfMemoryError 开启堆转储。

于 2012-09-12T07:06:24.070 回答