我有一個遠程Windows機器運行一些Java CMD應用程序。我需要從本地機器的命令提示符處獲取應用程序線程的堆棧跟蹤。 Iam不應該使用任何第三方應用程序。遠程計算機和本地計算機都安裝了JDK 7。什麼所有的細節我已經是如何獲得遠程Windows機器上運行的Java應用程序的所有線程的堆棧跟蹤
- 遠程計算機的名稱/ IP地址
- 應用
我有一個遠程Windows機器運行一些Java CMD應用程序。我需要從本地機器的命令提示符處獲取應用程序線程的堆棧跟蹤。 Iam不應該使用任何第三方應用程序。遠程計算機和本地計算機都安裝了JDK 7。什麼所有的細節我已經是如何獲得遠程Windows機器上運行的Java應用程序的所有線程的堆棧跟蹤
選項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));
的ThreadInfo
的toString()
方法並提供包括它的堆棧跟蹤線程狀態的可讀版本。你將不得不對其進行自定義,有點像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
由於 「沒有第三方應用程序,只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」連接到以上公開的遠程進程。連接後,只需在「線程」選項卡中查看您需要的內容。
感謝@reniaL的答案。我需要在一個文件中獲得堆棧跟蹤。我需要稍後解析一些其他用途的細節。GUI不會滿足我的目的。 – VISHNU 2014-12-03 06:29:15
謝謝@Andy的回答。我想要在一個文件中獲得線程堆棧跟蹤詳細信息,就像** jstack **正在做的那樣。所以我認爲jvisualvm不能幫助我,因爲只能手動保存它。我需要一個選項,如**命令>> file.txt ** – VISHNU 2014-12-03 06:35:14
已添加更多信息 – 2014-12-03 06:47:19
我無法對java應用程序(這是一個生產環境)進行任何調整。我在我的機器上運行一個監視應用程序,該監視應用程序在客戶機中擁有足夠的權限 – VISHNU 2014-12-03 07:15:14