首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于分析大型Java堆转储的工具

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

Stack Overflow用户
提问于 2011-08-31 15:49:16
回答 11查看 90.3K关注 0票数 90

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

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

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

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-08-31 16:35:58

通常,我使用的是包含在Eclipse Memory Analyzer中的ParseHeapDump.sh和描述的here,并且我将其放到一个更强大的服务器上(下载并复制到linux .zip发行版,在那里解压)。与从图形用户界面解析堆相比,shell脚本所需的资源更少,而且您可以在拥有更多资源的健壮的服务器上运行它(您可以通过在脚本的最后一行末尾添加类似-vmargs -Xmx40g -XX:-UseGCOverheadLimit的代码来分配更多的资源。例如,该文件的最后一行在修改后可能如下所示

代码语言:javascript
复制
./MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "$@" -vmargs -Xmx40g -XX:-UseGCOverheadLimit

./path/to/ParseHeapDump.sh ../today_heap_dump/jvm.hprof一样运行它

成功后,它会在.hprof文件旁边创建一些“索引”文件。

创建索引后,我尝试从中生成报告,并将这些报告scp到我的本地计算机,并尝试仅凭此来查找罪魁祸首(不只是报告,也不是索引)。这里有一个关于creating the reports的教程。

示例报告:

代码语言:javascript
复制
./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中的大部分处理都不需要那么多内存。
  • 在shell脚本上做这件事意味着我可以在无头服务器上做这件事(我通常也在无头服务器上做这件事,因为它们通常是最强大的服务器)。如果您有一台可以生成这种大小的堆转储的服务器,那么很可能还有另一台服务器也可以处理这么多的堆转储。
票数 86
EN

Stack Overflow用户

发布于 2011-08-31 16:26:20

这个相关问题的公认答案应该为您提供了一个良好的开端(如果您可以访问正在运行的进程,则会生成实时的jmap直方图而不是堆转储,它非常快):

Method for finding memory leak in large Java heap dumps

大多数其他堆分析器(我使用IBM )至少比堆多需要一定百分比的内存,如果您期望有一个很好的http://www.alphaworks.ibm.com/tech/heapanalyzer工具的话。

除此之外,许多开发人员使用替代方法,如实时堆栈分析,以了解正在发生的事情。

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

票数 6
EN

Stack Overflow用户

发布于 2015-07-15 14:24:36

第一步:增加分配给MAT的内存量。默认情况下,它不是很多,也不能打开大文件。

在MAC (OSX)上使用MAT的情况下,你会在MemoryAnalyzer.app/ MemoryAnalyzer.ini /MacOS中有一个文件MemoryAnalyzer.ini文件。对我来说,对那个文件进行调整并让他们“接受”是行不通的。相反,您可以基于此文件的内容创建修改后的启动命令/shell脚本,并从该目录运行它。在我的例子中,我想要20 GB的堆:

代码语言:javascript
复制
./MemoryAnalyzer -vmargs -Xmx20g --XX:-UseGCOverheadLimit ... other params desired

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7254017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档