我有一个要分析的 HotSpot JVM 堆转储。 VM 以 -Xmx31g
运行,堆转储文件大 48 GB。
- 我什至不会尝试
jhat
,因为它需要大约五倍的堆内存(在我的情况下是 240 GB)并且速度非常慢。 - 在分析堆转储数小时后,Eclipse MAT 崩溃并显示
ArrayIndexOutOfBoundsException
。
还有哪些其他工具可用于该任务?一套命令行工具是最好的,包括一个将堆转储转换为高效数据结构以供分析的程序,以及其他几个处理预结构化数据的工具。
原文由 Roland Illig 发布,翻译遵循 CC BY-SA 4.0 许可协议
通常,我使用的是
ParseHeapDump.sh
包含在 Eclipse Memory Analyzer 中并 在此处 进行了描述,我在我们更强大的服务器上执行此操作(下载并复制到 linux .zip 发行版,在那里解压缩)。与从 GUI 解析堆相比,shell 脚本需要更少的资源,而且您可以在拥有更多资源的强大服务器上运行它(您可以通过在最后一行的末尾添加-vmargs -Xmx40g -XX:-UseGCOverheadLimit
之类的内容来分配更多资源脚本的。例如,该文件的最后一行在修改后可能看起来像这样运行它就像
./path/to/ParseHeapDump.sh ../today_heap_dump/jvm.hprof
成功后,它会在 .hprof 文件旁边创建许多“索引”文件。
创建索引后,我尝试从中生成报告并将这些报告发送到我的本地机器,并尝试看看我是否可以通过它找到罪魁祸首(不仅仅是报告,不是索引)。这是有关 创建报告 的教程。
示例报告:
其他报告选项:
org.eclipse.mat.api:overview
和org.eclipse.mat.api:top_components
如果这些报告还不够,如果我需要更多的挖掘(比如通过 oql),我将索引和 hprof 文件 scp 到我的本地机器,然后打开堆转储(索引在与堆转储)和我的 Eclipse MAT GUI。从那里开始,它不需要太多内存即可运行。
编辑: 我只是想添加两个注释: