2015-05-04 38 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