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

用于分析大型Java堆转储的工具,java,profiling,Java,Profiling,我想分析热点JVM堆转储。VM使用-Xmx31g运行,堆转储文件大48 GB 我甚至不会尝试jhat,因为它需要大约五倍的堆内存(在我的情况下是240GB),而且速度非常慢 Eclipse MAT在分析堆转储数小时后,出现ArrayIndexOutOfBoundsException崩溃 还有哪些其他工具可用于该任务?最好是一套命令行工具,其中包括一个将堆转储转换为高效数据结构进行分析的程序,再加上其他几个处理预结构化数据的工具。这个相关问题的公认答案应该为您提供一个良好的开端(使用实时jma

我想分析热点JVM堆转储。VM使用
-Xmx31g
运行,堆转储文件大48 GB

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

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

这个相关问题的公认答案应该为您提供一个良好的开端(使用实时jmap直方图而不是堆转储):

如果您希望有一个好的GUI工具,那么大多数其他堆分析器(我使用IBM)至少需要比堆多一个百分比的RAM

除此之外,许多开发人员使用其他方法,如实时堆栈分析来了解情况


尽管我必须质疑为什么堆这么大?对分配和垃圾收集的影响肯定很大。我敢打赌,堆中的大部分内容实际上应该存储在数据库/持久缓存等中。

通常,我使用的是
ParseHeapDump.sh
包含在其中并进行了描述,我就是这么做的在我们的一个更强大的服务器上(通过linux.zip发行版下载并复制,解压到那里)。shell脚本比从GUI解析堆需要更少的资源,另外,您可以使用更多的资源在强大的服务器上运行它(您可以通过在脚本的最后一行末尾添加类似于
-vmargs-Xmx40g-XX:-usegcoveredlimit
的内容来分配更多资源。 例如,修改后该文件的最后一行可能如下所示

./MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "$@" -vmargs -Xmx40g -XX:-UseGCOverheadLimit
/path/to/ParseHeapDump.sh../today\u heap\u 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\u组件

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

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

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

我建议试试你的工具包。它通常需要比堆转储大小少一点的内存(它对它进行索引,并使用这些信息检索你想要的内容)

一个不太知名的工具-适用于大堆。它通过采样工作,因此它不必读取整个内容,尽管有点挑剔。

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

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

./MemoryAnalyzer -vmargs -Xmx20g --XX:-UseGCOverheadLimit ... other params desired
只需通过终端从Contents/MacOS目录运行此命令/脚本,即可启动GUI,并提供更多可用RAM。

更多选项:

此人

编写了一个自定义Netbeans堆分析器,它只通过堆转储文件公开一个“查询样式”接口,而不是实际将文件加载到内存中

虽然我不知道“他的查询语言”是否比这里被接受的答案中提到的EclipseOQL更好


JProfiler 8.1(用户许可证为499美元)还能够在不花费大量资金的情况下遍历大型堆。

这不是命令行解决方案,但我喜欢这些工具:

将堆转储复制到足以承载它的服务器上。很可能可以使用原始服务器

通过
ssh-X
进入服务器以远程运行图形工具,并使用Java二进制目录中的
jvisualvm
加载堆转储的
.hprof
文件


该工具不会立即将完整的堆转储加载到内存中,而是在需要时加载部分。当然,如果您在文件中仔细查看,所需的内存最终将达到堆转储的大小。

尝试使用jprofiler,它在分析大型.hprof时效果很好。我已经尝试过使用大小约为22 GB的文件

https://www.ej-technologies.com/products/jprofiler/overview.html

我遇到了一个有趣的工具,名为JXray。它提供有限的评估试用许可证。发现查找内存泄漏非常有用。你可以试一试。

Eclipse memory Analyzer的最新快照版本有一个功能,可以随机丢弃一定百分比的对象,以减少内存消耗并允许剩余的对象使用要分析的ts。请参阅