没有 JDK 的 JRE 6 (Windows) 上的堆转储

Heap dump on JRE 6 (Windows) without JDK

有没有办法在没有安装 JDK 的远程机器上创建堆转储?

我无法更改安装/设置,它在 Windows 上 运行。 所以我可以正常使用命令行工具。

问题是远程机器上的 Java 应用程序冻结(没有内存不足异常,所以 -XX:-HeapDumpOnOutOfMemoryError 没有用)我们需要创建一个转储。

-XX:+HeapDumpOnCtrlBreak 

也不是选项,因为它在 JDK6+ 上不再受支持。

出于安全原因,不允许使用 JMX。

有什么想法吗?感谢您的帮助!

编辑:

您已经在端口中启用了 jmx 控制台来启动您的应用程序以调试您的应用程序。执行 jconsole 并连接到您已启用调试的端口。您还可以使用 jmap 来收集 heapdump。

您可以使用 jvisualvm,只需启用 jmx 端口并连接到您的应用程序,然后您就可以生成一个堆文件。

您可以通过添加以下参数来实现:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.port=8484
-Dcom.sun.management.jmxremote.ssl=false

然后您需要手动添加 tomcat 进程,因此 right click on you localhost node -> Add JMX Connection -> type your port -> OK.

您的 tomcat 进程将列在本地主机节点下。

最简单的解决方案是在命令行中使用 jmap -dump:liv,format=b,file=app.dump。您可以使用 jps -lvm 来查找进程 ID。

另一种方法是将其连接到 jvisualvm 这将为您获取转储并进行分析。您还可以使用此工具读取由 jmap 编写的转储,因此您最终可能会使用它。

jvisualvm 挣扎的地方是大型堆转储,即超过主内存大小的一半。我发现使用 YourKit 可以处理更大的转储并提供更多有用的信息。诊断此问题可能只需要一个评估许可证。

jmx is not allowed due to security reasons

在那种情况下,您无法远程执行此操作,除非您使用 YourKit 或其他一些商业分析器。

JProfiler 有一个命令行实用程序 bin/jpdump 可以进行 HPROF 堆转储。无需安装JDK。也不需要 运行 JProfiler 的 GUI 安装程序,只需解压 ZIP 分发并在命令行上执行 jpdump。

免责声明:我公司开发了 JProfiler。


更新2016-06-23

从 JProfiler 9.2 开始,jpdump 和 jpenable 运行 以及 Java 6。

     jmap -dump:format=b,file=snapshot.jmap  
     process-pid

无论 Java VM 是如何启动的,jmap 工具都会生成一个 head dump 快照,在上面的例子中是在一个名为 snapshot.jmap 的文件中。 jmap 输出文件应包含所有原始数据,但不会包含任何显示对象创建位置的堆栈跟踪。

我想我解决了问题。

你必须 "patch" 你的 JRE 和 JDK 的一些文件(当然是相同的版本 - 如果你是 运行 jre6uXX 你需要来自 jdk6uXX 的相应文件)

复制以下文件:

  • \JDK6uXX\bin\attach.dll --> %JAVAJRE_HOME%\bin\
  • \JDK6uXX\bin\jmap.exe --> %JAVAJRE_HOME%\bin\
  • \JDK6uXX\lib\tools.jar --> %JAVAJRE_HOME%\lib\

没有文件被覆盖,JRE 应该不会受此影响。

现在您可以使用 jmap 进行转储了;-)

感谢您的帮助!再见