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

标签 java profiling

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

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

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

最佳答案

一般我用的是ParseHeapDump.sh包含在 Eclipse Memory Analyzer 内并描述了here ,然后我在我们更强大的服务器上执行此操作(下载并复制 linux .zip 发行版,在那里解压缩)。 shell 脚本比从 GUI 解析堆需要更少的资源,而且您可以在拥有更多资源的强大服务器上运行它(您可以通过在脚本最后一行的末尾添加类似 -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 文件旁边创建一些“索引”文件。

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

示例报告:

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

其他报告选项:

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

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

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

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

关于java - 用于分析大型 Java 堆转储的工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65942754/

相关文章:

java - 无法更改数组的大小

java - System.currentTimeMillis()方法: returning huge value for execution time then actual execution time

go - 如何分析 goroutines 的数量

java - 如何在非常大的java项目中检查动态类的使用

linux - setitimer, SIGALRM & 多线程进程 (linux, c)

java - 如何在 web.xml 中为 Java Web 应用程序使用 <icon>?

java - `Iterator` 是否可以直接或间接使用与 `Iterable` 无关的内容?

java - java中的静态和非静态?

c++ - 合并两个 C++ 包

c++ - C/C++ AQtime 分析器问题