没有 JDK 的 JRE 6 (Windows) 上的堆转储
Heap dump on JRE 6 (Windows) without JDK
有没有办法在没有安装 JDK 的远程机器上创建堆转储?
我无法更改安装/设置,它在 Windows 上 运行。
所以我可以正常使用命令行工具。
问题是远程机器上的 Java 应用程序冻结(没有内存不足异常,所以 -XX:-HeapDumpOnOutOfMemoryError 没有用)我们需要创建一个转储。
-XX:+HeapDumpOnCtrlBreak
也不是选项,因为它在 JDK6+ 上不再受支持。
出于安全原因,不允许使用 JMX。
有什么想法吗?感谢您的帮助!
编辑:
- Windows
- 没有JDK
- 没有 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 进行转储了;-)
感谢您的帮助!再见
有没有办法在没有安装 JDK 的远程机器上创建堆转储?
我无法更改安装/设置,它在 Windows 上 运行。 所以我可以正常使用命令行工具。
问题是远程机器上的 Java 应用程序冻结(没有内存不足异常,所以 -XX:-HeapDumpOnOutOfMemoryError 没有用)我们需要创建一个转储。
-XX:+HeapDumpOnCtrlBreak
也不是选项,因为它在 JDK6+ 上不再受支持。
出于安全原因,不允许使用 JMX。
有什么想法吗?感谢您的帮助!
编辑:
- Windows
- 没有JDK
- 没有 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 进行转储了;-)
感谢您的帮助!再见