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

2022-08-31 10:52:09

我有一个 HotSpot JVM 堆转储,我想分析它。VM 与 一起运行,堆转储文件的大小为 48 GB。-Xmx31g

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

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


答案 1

通常,我使用的内容包含在Eclipse Memory Analyzer中并在此处进行描述,并且我将其添加到我们更强大的服务器上(下载并复制linux.zip发行版,在那里解压缩)。与从 GUI 解析堆相比,shell 脚本需要的资源更少,而且您可以在拥有更多资源的强力服务器上运行它(您可以通过在脚本的最后一行末尾添加类似的东西来分配更多资源)。例如,修改后,该文件的最后一行可能如下所示ParseHeapDump.sh-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:overvieworg.eclipse.mat.api:top_components

如果这些报告还不够,如果我需要更多的挖掘(即通过oql),我会将索引和hprof文件scp到我的本地机器,然后使用我的Eclipse MAT GUI打开堆转储(索引与堆转储位于同一目录中)。从那里,它不需要太多的内存来运行。

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

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

答案 2

第一步:增加分配给 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。


推荐