我有一个想要分析的HotSpot JVM堆转储。虚拟机使用-Xmx31g
运行,堆转储文件大小为48 GB。
jhat
,因为它需要大约五倍的堆内存(在我的例子中是240 GB ),而且非常慢。ArrayIndexOutOfBoundsException
。还有哪些工具可用于该任务?最好是一套命令行工具,其中包括一个将堆转储转换为有效数据结构以进行分析的程序,以及几个处理预结构化数据的其他工具。
发布于 2011-08-31 16:35:58
通常,我使用的是包含在Eclipse Memory Analyzer中的ParseHeapDump.sh
和描述的here,并且我将其放到一个更强大的服务器上(下载并复制到linux .zip发行版,在那里解压)。与从图形用户界面解析堆相比,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文件旁边创建一些“索引”文件。
创建索引后,我尝试从中生成报告,并将这些报告scp到我的本地计算机,并尝试仅凭此来查找罪魁祸首(不只是报告,也不是索引)。这里有一个关于creating the reports的教程。
示例报告:
./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects
其他报告选项:
org.eclipse.mat.api:overview
和org.eclipse.mat.api:top_components
如果这些报告还不够,并且如果我需要进一步挖掘(比如通过oql),我会将索引以及hprof文件scp到我的本地机器,然后使用Eclipse MAT GUI打开堆转储(索引与堆转储在同一目录中)。从那里开始,它不需要太多的内存就可以运行。
编辑:我只想添加两个注释:
据我所知,
发布于 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工具的话。
除此之外,许多开发人员使用替代方法,如实时堆栈分析,以了解正在发生的事情。
尽管我必须质疑为什么你的堆这么大?对分配和垃圾收集的影响肯定是巨大的。我敢打赌,堆中的大部分内容实际上应该存储在数据库/持久缓存等中。
发布于 2015-07-15 14:24:36
第一步:增加分配给MAT的内存量。默认情况下,它不是很多,也不能打开大文件。
在MAC (OSX)上使用MAT的情况下,你会在MemoryAnalyzer.app/ MemoryAnalyzer.ini /MacOS中有一个文件MemoryAnalyzer.ini文件。对我来说,对那个文件进行调整并让他们“接受”是行不通的。相反,您可以基于此文件的内容创建修改后的启动命令/shell脚本,并从该目录运行它。在我的例子中,我想要20 GB的堆:
./MemoryAnalyzer -vmargs -Xmx20g --XX:-UseGCOverheadLimit ... other params desired
只需通过终端从Contents/MacOS目录运行此命令/脚本,即可启动GUI,并提供更多可用的RAM。
https://stackoverflow.com/questions/7254017
复制相似问题