在没有JDK的情况下在JRE 6(Windows)上堆转储

时间:2015-05-04 08:41:14

标签: java memory-leaks heap dump

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

我无法更改安装/设置,并且它在Windows上运行。 所以我可以访问命令行工具。

问题是远程计算机上的Java应用程序冻结(没有内存不足因此-XX:-HeapDumpOnOutOfMemoryError无用),我们需要创建转储。

-XX:+HeapDumpOnCtrlBreak 

也没有选择,因为它不再支持JDK6 +。

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

任何想法?谢谢你的帮助!

编辑:

  • 没有JDK
  • 没有JMX

6 个答案:

答案 0 :(得分:5)

我想我解决了这个问题。

你必须使用JDK的一些文件“修补”你的JRE(相同版本的课程 - 如果你正在运行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来进行转储; - )

感谢您的帮助!再见

答案 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输出文件应包含所有原始数据,但不包括显示对象创建位置的任何堆栈跟踪。

相关问题