我有一个大的(5GB)hprof转储,由OutOfMemoryError
发生时由应用程序创建。 (使用XX: HeapDumpOnOutOfMemoryError)。
不幸的是,发生此错误时没有收集日志。重新创建这将需要几个小时。我希望有些工具可以显示异常堆栈跟踪或来自hprof的所有线程堆栈等。
我目前正在使用MAT,看不到获取线程信息的方法。我可以使用哪种工具?
(我不确定在发生OOM时hprof文件是否有关于调用的线程/位置的信息。)
(我知道如何在正常情况下进行线程转储。这里的问题是事件已经发生,我所拥有的只是hprof转储。)
答案 0 :(得分:12)
回答自己的问题。积分转到@ RC
答案 1 :(得分:5)
MAT可以show the threads directly now(也许这是在提出问题后添加的。)
主题概述
要获得堆转储中所有线程的概述,请使用工具栏中的“线程概述”按钮,如下图所示。或者,可以使用查询浏览器>线程概述和堆栈查询:
答案 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打开堆转储。