2015-05-04 75 views
3

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

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

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

-XX:+HeapDumpOnCtrlBreak 

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

由于安全原因,不允许JMX。

任何想法?感谢您的帮助!

编辑:

  • 的Windows
  • 没有JDK
  • 没有JMX

回答

4

我想我解决了这个问题。

你要“打补丁”的JRE与JDK的一些文件(相同的版本,当然 - 如果你正在运行jre6uXX你需要从jdk6uXX相应的文件)

复制以下文件:

  • \ JDK6uXX \ BIN \ attach.dll - >%JAVAJRE_HOME%\ BIN \
  • \ JDK6uXX \ BIN \ jmap.exe - >%JAVAJRE_HOME%\ BIN \
  • \ JDK6uXX \ LIB \工具。 jar - >%JAVAJRE_HOME%\ lib \

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

现在你可以使用JMAP就好采取转储;-)

我感谢您的帮助!再见

+0

当我尝试这个时,我收到一条消息,说'程序项JLI_CmdToArgs不能位于动态链接库jli.dll' – Kevin

+1

刚试过w/8u152,这个“补丁”仍然有效 –

1

你必须开始用端口启用调试应用程序JMX控制台应用程序。执行jconsole并连接到您已启用调试的端口。您也可以使用jmap来收集堆转储。

+0

由于安全原因不允许jmx – 98percentmonkey

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节点下。

+0

由于安全原因,不允许JMX。 – 98percentmonkey

2

最简单的解决方案是在命令行上使用​​。您可以使用jps -lvm来查找进程ID。

另一种方法是连接到它jvisualvm这将采取转储并为您分析它。您也可以使用此工具读取由jmap写入的转储,以便最终可以最终使用它。

其中jvisualvm挣扎是为了大堆转储,即超过大约一半的内存大小。我发现使用YourKit来处理更大的转储,并提供更多有用的信息。您可能需要一个评估许可证来诊断此问题。

JMX是不是由于允许安全原因

在这种情况下,你不能这样做远程的,除非你使用YourKit或其他商业探查。

+0

正如我所说没有jdk可用:) – 98percentmonkey

+1

@ 98percentmonkey你是指任何机器上,或只是运行该程序的机器。如果您的网络上的任何计算机上都具有相同版本的JDK,则可以远程执行此操作。 –

+0

在运行机器上,但可悲的是没有JMX,如果:( – 98percentmonkey

1

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

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


更新2016年6月23日

截至JProfiler的9.2,jpdump和jpenable运行与Java 6为好。

+0

谢谢。有没有办法用参数执行jddump? 通过.bat转储会非常好。jpdump 或类似的东西。 – 98percentmonkey

+1

是的,'jpdump -p [pid]'就是这样。这样的说法是给出的,jpdump是交互式的并列出了所有的Java进程。 –

+0

很好的工具,但遗憾的是它需要JDK8和jprofiler 7(wh ich可以使用jdk6/7)没有jpdump.exe:( – 98percentmonkey

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

不管Java虚拟机是如何启动,JMAP工具将在一个名为snapshot.jmap产生头转储快照,在上面的例子。 jmap输出文件应该包含所有的原始数据,但不会包含任何显示对象创建位置的堆栈跟踪信息。

+0

没有像上面说的那样在机器上访问jdk,对不起 – 98percentmonkey