如果只能为 JVM 分配 1.5GB,是否有分析大型 Java 堆转储(2GB)的工具?我不敢相信转储必须完全加载到内存中才能进行分析......
Eclipse MemoryAnalyzer 失败了,IBM 工具也失败了。
我现在需要在这里使用命令行工具吗?
如果它是开发服务器,请将最大堆大小限制为 32 位操作系统可以处理的大小。如果它在生产中,需要一个 64 位操作系统!如果你不能做到这一点,你可以在服务器上运行 jhat(它有一个你可以在你自己的 PC 上访问的 web 界面)。
一种解决方案是MAT tool
在远程服务器上安装并生成分析的 HTML 输出以在本地下载和查看。这省去了尝试在远程机器上安装 X Windows 并ssh
整理所有隧道的麻烦(这当然也是一个选项)。
首先,下载并安装独立的 Eclipse RCP 应用程序。然后转移到您的服务器并解压缩。然后确定堆转储的大小,如有必要,修改MemoryAnalyzer.in i 文件以实例化具有足够 RAM 用于堆转储的 JVM。
在此示例中,我有一个 11GB 堆转储并修改了最后两行(添加 -Xms)
-startup
plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.300.v20150602-1417
-vmargs
-Xmx16g
-Xms16g
执行初始运行以解析堆转储。这将生成可供后续运行使用的中间数据,以加快未来的分析速度。
./ParseHeapDump.sh /path/to/heap-dump
完成后,您可以对数据运行多种不同分析中的任何一种。以下是如何搜索内存泄漏嫌疑人的说明。
./ParseHeapDump.sh /path/to/heap-dump org.eclipse.mat.api:suspec
不幸的是,Eclipse MAT 和所有堆转储分析工具将整个堆转储加载到内存中以进行分析。如果 Eclipse MAT 对你来说失败了,你可以试试HeapHero工具。JHAT 比 Eclipse MAT 需要更多的内存和时间来分析堆转储。