java - 我如何分析 35-40 GB 左右的大型堆转储

标签 java garbage-collection profiling heap-dump

我必须分析大小为 35-40GB 的 java 堆转储,除了大内存的远程服务器外,无法在本地机器上加载它。

我找到了 Tool for analyzing large Java heap dumps作为迄今为止最好的链接。但是在配置所有东西并正确执行所有命令行之后,我无法获得任何报告文件。

我的ParseHeapDump.sh 文件看起来是

#!/bin/sh
#
# This script parses a heap dump.
#
# Usage: ParseHeapDump.sh <path/to/dump.hprof> [report]*
#
# The leak report has the id org.eclipse.mat.api:suspects
# The top component report has the id org.eclipse.mat.api:top_components
#
./MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "$@" -vmargs -Xms8g -Xmx10g -XX:-UseGCOverheadLimit

MemoryAnalyzer.ini 文件看起来像

-startup
plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.700.v20180518-1200
java -Xmx8g -Xms10g -jar plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar -consoleLog -consolelog -application org.eclipse.mat.api.parse "$@"
-vmargs
-Xms8g
-Xmx10g

如果我在配置中犯了任何错误,请告诉我,或者向我推荐市场上可用的任何其他工具。

最佳答案

处理大型堆转储是一项挑战。 VisualVM 和 Eclipse 内存分析器都需要太多内存来处理几十 GiB 量级的堆转储。

商业分析器显示出更好的结果(尤其是 YourKit),尽管我不确定它们的实际限制。

为了例行处理 100+ GiB,我为您提供了 headless 解决方案 heaplib ,它基于 VisualVM(实际上是 Netbeans)的代码库。

Heaplib 既不是图形化的,也不是交互式的。它面向自动报告。 该工具允许您使用 OQL/JavaScript(如果您愿意,也可以使用 Java)编写用于堆分析的代码,但功能会受到内存要求的限制。处理 100GiB 可能需要几个小时,但对于非交互式工作流来说,这是可以接受的。

关于java - 我如何分析 35-40 GB 左右的大型堆转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63997436/

相关文章:

c - 衡量分支预测命中率的方法

ruby-on-rails - 如何使用详细信息分析 Rails 请求?

java - WebLogic NoClassDefFoundError 即使使用 <prefered-application-packages>

java - XML 正确编码,但未解码,因为 XML 文档被声明为无效

java - 我的程序跳过让用户输入一个变量的值

C# 定时器和垃圾回收

c - Lua 垃圾回收 : Will reassigned userdata have its __gc meta event triggered?

java - 如何在不依赖方法的情况下删除链表末尾的节点?

java - 最大堆大小 xmx 如何影响 Java 中的内存分配/已用堆?

python - 测量在 python 进程中调用的 C 库的覆盖率