有没有办法在没有安装JDK的远程计算机上创建堆转储?
我无法更改安装/设置,并且它在Windows上运行。 所以我可以访问命令行工具。
问题是远程计算机上的Java应用程序冻结(没有内存不足因此-XX:-HeapDumpOnOutOfMemoryError无用),我们需要创建转储。
-XX:+HeapDumpOnCtrlBreak
也没有选择,因为它不再支持JDK6 +。
出于安全原因,不允许使用JMX。
任何想法?谢谢你的帮助!
编辑:
答案 0 :(得分:5)
我想我解决了这个问题。
你必须使用JDK的一些文件“修补”你的JRE(相同版本的课程 - 如果你正在运行jre6uXX,你需要jdk6uXX中的相应文件)
复制以下文件:
不会覆盖任何文件,JRE不应受此影响。
现在你可以正常使用jmap来进行转储; - )
感谢您的帮助!再见
答案 1 :(得分:2)
最简单的解决方案是在命令行上使用jmap -dump:liv,format=b,file=app.dump
。您可以使用jps -lvm
查找进程ID。
另一种方法是将其连接到jvisualvm
这将转储并为您分析。您也可以使用此工具读取由jmap编写的转储,以便最终可能最终使用它。
jvisualvm
斗争是针对大堆转储的,即超过主内存大小的一半。我发现使用YourKit来处理更大的转储并提供更多有用的信息。您可能只需要评估许可证来诊断它。
由于安全原因,不允许使用jmx
在这种情况下,除非您使用YourKit
或其他商业资料分析器,否则您无法远程执行此操作。
答案 2 :(得分:1)
您已在端口中启用jmx控制台启动应用程序以调试应用程序。执行jconsole并连接到已启用调试的端口。您还可以使用jmap来收集heapdump。
答案 3 :(得分:1)
JProfiler有一个命令行实用程序bin/jpdump
,可以进行HPROF堆转储。无需安装JDK。也无需运行JProfiler的GUI安装程序,只需解压缩ZIP分发并在命令行上执行jpdump。
免责声明:我公司开发JProfiler。
更新2016-06-23
从JProfiler 9.2开始,jpdump和jpenable也与Java 6一起运行。
答案 4 :(得分:0)
您可以使用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进程将列在localhost节点下。
答案 5 :(得分:0)
jmap -dump:format=b,file=snapshot.jmap
process-pid
无论Java VM是如何启动的,jmap工具都会在上面的示例中生成一个头部转储快照,名为snapshot.jmap。 jmap输出文件应包含所有原始数据,但不包括显示对象创建位置的任何堆栈跟踪。