用于分析大型 Java 堆转储的工具

新手上路,请多包涵

我有一个要分析的 HotSpot JVM 堆转储。 VM 以 -Xmx31g 运行,堆转储文件大 48 GB。

  • 我什至不会尝试 jhat ,因为它需要大约五倍的堆内存(在我的情况下是 240 GB)并且速度非常慢。
  • 在分析堆转储数小时后,Eclipse MAT 崩溃并显示 ArrayIndexOutOfBoundsException

还有哪些其他工具可用于该任务?一套命令行工具是最好的,包括一个将堆转储转换为高效数据结构以供分析的程序,以及其他几个处理预结构化数据的工具。

原文由 Roland Illig 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 844
2 个回答

通常,我使用的是 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 文件旁边创建许多“索引”文件。

创建索引后,我尝试从中生成报告并将这些报告发送到我的本地机器,并尝试看看我是否可以通过它找到罪魁祸首(不仅仅是报告,不是索引)。这是有关 创建报告 的教程。

示例报告:

 ./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects

其他报告选项:

org.eclipse.mat.api:overvieworg.eclipse.mat.api:top_components

如果这些报告还不够,如果我需要更多的挖掘(比如通过 oql),我将索引和 hprof 文件 scp 到我的本地机器,然后打开堆转储(索引在与堆转储)和我的 Eclipse MAT GUI。从那里开始,它不需要太多内存即可运行。

编辑: 我只是想添加两个注释:

  • 据我所知,只有索引的生成是 Eclipse MAT 的内存密集型部分。获得索引后,Eclipse MAT 的大部分处理都不需要那么多内存。
  • 在 shell 脚本上执行此操作意味着我可以在无头服务器上执行此操作(我通常也在无头服务器上执行此操作,因为它们通常是最强大的服务器)。如果您有一台服务器可以生成那么大的堆转储,那么很可能您还有另一台服务器也可以处理那么多的堆转储。

原文由 Franz See 发布,翻译遵循 CC BY-SA 3.0 许可协议

第一步:增加分配给 MAT 的 RAM 量。默认情况下它不是很多并且无法打开大文件。

如果在 MAC (OSX) 上使用 MAT,您将在 MemoryAnalyzer.app/Contents/MacOS 中找到 MemoryAnalyzer.ini 文件。对那个文件进行调整并让它们“接受”对我来说是行不通的。您可以改为根据此文件的内容创建修改后的启动命令/shell 脚本,然后从该目录运行它。在我的例子中,我想要 20 GB 的堆:

 ./MemoryAnalyzer -vmargs -Xmx20g --XX:-UseGCOverheadLimit ... other params desired

只需通过终端从 Contents/MacOS 目录运行此命令/脚本,即可启动具有更多可用 RAM 的 GUI。

原文由 Michael Shvets 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题