我有一个HotSpot JVM堆转储,我想分析一下。VM运行时带有-Xmx31g
,堆转储文件的大小为48 GB。
jhat
,因为它需要大约五倍的堆内存(在我的情况下为240 GB),而且速度非常慢。ArrayIndexOutOfBoundsException
在分析了几个小时的堆转储后,Eclipse MAT崩溃了。还有哪些其他工具可用于该任务?最好使用一套命令行工具,其中包括一个程序,该程序将堆转储转换为有效的数据结构以进行分析,再结合使用其他几个可处理预构建数据的工具。
通常,我使用的内容ParseHeapDump.sh
包含在Eclipse Memory
Analyzer中,
并在此处进行了描述,并将其添加到功能更强大的服务器上(通过linux
.zip发行版下载并复制,然后在其中解压缩)。与从GUI解析堆相比,shell脚本所需的资源更少,此外,您可以在具有更多资源的强大服务器上运行它(您可以通过-vmargs -Xmx40g -XX:-UseGCOverheadLimit
在脚本最后一行的末尾添加类似内容来分配更多资源。例如,修改后,该文件的最后一行可能如下所示
./MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "$@" -vmargs -Xmx40g -XX:-UseGCOverheadLimit
像这样运行 ./path/to/ParseHeapDump.sh ../today_heap_dump/jvm.hprof
成功之后,它会在.hprof文件旁边创建许多“索引”文件。
创建索引之后,我尝试从中生成报告并将这些报告scp到本地计算机,并尝试查看是否可以仅凭此找到罪魁祸首(不仅是报告,还不是索引)。这是有关创建报告的教程。
报告示例:
./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects
其他报告选项:
org.eclipse.mat.api:overview
和 org.eclipse.mat.api:top_components
如果这些报告还不够,并且还需要进一步挖掘(例如,通过oql进行说明),我会将索引以及hprof文件scp到本地计算机,然后打开堆转储(索引位于与堆转储)与我的Eclipse
MAT GUI。从那里开始,它不需要太多的内存即可运行。
编辑: 我只是喜欢添加两个说明:
我有一个非常奇怪的问题。我有一个30 GB的堆转储,我想在我的笔记本电脑上分析相同的(它有8 GB的内存)。我试着用MAT和IBM堆分析器这样做,但是根据他们的建议,Xmx大小应该超过转储大小。我也试着用MAT的文件分析堆转储,但是收到内存错误。 关于如何成功分析笔记本电脑上的垃圾,有什么建议吗? 提前谢谢!
我正在经历内存泄漏,这里有一些细节。 在泄漏后, null null 我很惊讶顶部、堆转储大小和实际堆大小之间的差异。我猜测top和heap之间的区别是垃圾收集器堆和本地堆区域的可能性。但是,为什么堆转储文件大小和实际堆大小(来自eclipse MAT analyzer)会不同呢? 对这个问题有什么见解吗? 更新/回答 一些建议是使用jcmd(https://docs.oracle.com/jav
我一直在分析我们服务的Java.lang.OutofMemoryError:Java堆空间,并试图通过Eclipse MAT工具挖掘堆转储。 我们的服务使用8G堆运行,生成的堆转储的大小只有500 MB。
问题内容: 我想编写一个程序(最好在Java中),以分析和分析Java堆转储文件(由jmap创建)。我知道已经有很多很棒的工具(jhat,eclipse的MAT等),但是我想从特定的角度分析应用程序中的堆。 在哪里可以阅读有关堆转储文件的结构,如何读取该文件的示例等?找不到有用的搜索内容… 非常感谢。 问题答案: 我不熟悉jhat,但是Eclipse的MAT是开源的。他们的SVN链接可用,也许您可
我想写一个程序(最好是在java中),它将解析和分析一个java堆转储文件(由jmap创建)。我知道有很多很棒的工具已经这样做了(jhat,eclipse的MAT,等等),但是我想从一个特定的角度来分析堆到我的应用程序。 我在哪里可以阅读堆转储文件的结构,示例如何阅读它,等等?没有找到任何有用的搜索... 非常感谢。