通常,我使用的内容包含在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:overview
和org.eclipse.mat.api:top_components
如果这些报告还不够,如果我需要更多的挖掘(即通过oql),我会将索引和hprof文件scp到我的本地机器,然后使用我的Eclipse MAT GUI打开堆转储(索引与堆转储位于同一目录中)。从那里,它不需要太多的内存来运行。
编辑:我只是喜欢添加两个注释:
- 据我所知,只有索引的生成才是Eclipse MAT的内存密集型部分。拥有索引后,Eclipse MAT 的大部分处理工作都不需要那么多内存。
- 在shell脚本上执行此操作意味着我可以在无外设服务器上执行此操作(我通常也在无外设服务器上执行此操作,因为它们通常是最强大的)。如果你有一个可以生成这种大小的堆转储的服务器,那么你很可能还有另一台服务器可以处理那么多的堆转储。