2014-12-03 60 views

回答

1

選項1 - 您可以使用下面的jmx選項啓動應用程序,並通過jvisualvm連接到運行在遠程機器上的jvm實例。 JVisualVM提供了一種採取thread dumps的方法。

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9010 
-Dcom.sun.management.jmxremote.local.only=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 

線程轉儲可以保存到文本文件(手動)以供日後分析。

選項2 - 如果您想自動執行線程轉儲過程,那麼在java應用程序本身中添加該邏輯會更簡單。 JMX提供了一種方法採取線程轉儲,雖然它的格式是從哪個jstack(本機)不同的具有

List<ThreadInfo> threads = Arrays.asList(ManagementFactory.getThreadMXBean().dumpAllThreads(true, true)); 

ThreadInfotoString()方法並提供包括它的堆棧跟蹤線程狀態的可讀版本。你將不得不對其進行自定義,有點像TDA

選項,使其在語法分析的工具3 - 至於你提到,你不能調整運行的應用程序,另一種選擇是使用執行遠程過程PsExec。由於它的Windows服務器,這應該有所幫助。看看命令行選項here

PsExec.exe \\RemoteMachine -u Domain\username -p password C:\java\jdk\bin\jstack.exe 7300 > E:\Dump\threaddump.txt 

應該在本地機器上創建threaddump.txt文件。這可以在批處理文件中執行,以自動執行線程轉儲,如下所示:

:loop 
&:: Add your remote psexec command here. 
ping localhost -n 11 > nul 
goto loop 
+0

謝謝@Andy的回答。我想要在一個文件中獲得線程堆棧跟蹤詳細信息,就像** jstack **正在做的那樣。所以我認爲jvisualvm不能幫助我,因爲只能手動保存它。我需要一個選項,如**命令>> file.txt ** – VISHNU 2014-12-03 06:35:14

+0

已添加更多信息 – 2014-12-03 06:47:19

+0

我無法對java應用程序(這是一個生產環境)進行任何調整。我在我的機器上運行一個監視應用程序,該監視應用程序在客戶機中擁有足夠的權限 – VISHNU 2014-12-03 07:15:14

0

由於 「沒有第三方應用程序,只JDK」,那麼你應該嘗試的PID JConsole的,這是作爲JDK的一部分,顯示應該滿足您需要的各種Java應用程序的信息。

在這裏看到:Exposing a Resource for Remote Management By JConsole

一般來說,你應該做的:

首先,暴露的遠程管理,例如應用程序屬性啓動遠程機器上的Java應用程序

java -Dcom.sun.management.jmxremote.port = 9999 \ 
    -Dcom.sun.management.jmxremote.authenticate = false \ 
    -Dcom.sun.management.jmxremote.ssl = false \ 
    YOUR_APP 

然後,在本地機器上啓動jconsole,通過格式「HOSTNAME:PORT」連接到以上公開的遠程進程。連接後,只需在「線程」選項卡中查看您需要的內容。

+0

感謝@reniaL的答案。我需要在一個文件中獲得堆棧跟蹤。我需要稍後解析一些其他用途的細節。GUI不會滿足我的目的。 – VISHNU 2014-12-03 06:29:15

相關問題