2013-01-02 46 views
18

我正在分析採用線程轉儲的方法之間的差異。下面是他們夫婦的我研究上在生產中採用線程轉儲

  1. 定義JMX Bean上通過的Runtime.exec觸發jstack()上單擊聲明豆操作。

  2. 守護線程在預定義的時間間隔後重復執行「ManagementFactory.getThreadMXBean()。dumpAllThreads(true,true)」。

比較兩者之間的線程轉儲輸出,我看到下面的缺點的方法登錄與做法2 2

  1. 線程轉儲不能開源線程轉儲分析器像TDA
  2. 解析輸出不包括本地線程ID,這可能有助於分析高CPU問題(對吧?)
  3. 還有更多?

我希望對

  1. 獲得建議/輸入那裏通過的Runtime.exec()在生產代碼執行jstack的任何缺點?各種操作系統上的兼容性問題 - windows,linux?

  2. 任何其他方法採取線程轉儲?

謝謝。

編輯 -

的1和2相結合的辦法似乎是要走的路。我們可以在後臺運行一個專用線程,並以線程轉儲分析程序能夠理解的格式將日誌文件中的線程轉儲打印出來。 如果需要任何額外的信息(如說可能是本地線程ID),它只記錄jstack輸出,我們根據需要手動執行。

+0

這與JEE應用程序有關嗎? –

+0

@WaleedMadanat是 –

回答

29

您可以使用

jstack {pid} > stack-trace.log 

運行作爲其中的進程正在運行輸入框中輸入用戶。

如果您多次運行此操作,則可以使用diff來更容易地查看哪些線程處於活動狀態。


對於分析堆棧跟蹤我使用以下定期在專用線程中採樣。

Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces(); 

使用此信息,您可以獲取線程的ID,運行狀態並比較堆棧跟蹤。

+0

執行jstack的第一點與上面提到的方法1相同嗎?通過jmx集成和觸發它可以幫助用戶不必擔心進程ID。同樣,在jmx方法中,我們可以安排jstack在每個指定的時間間隔後重復執行。關於調用Thread.getAllStackTraces()的第二點。這意味着我將以線程轉儲分析器解釋的方式手動記錄線程轉儲。這種方法比您提到的第一個方法有什麼好處? –

+0

我會在程序中使用分析儀,只記錄您感興趣的信息。在我的情況下,只有當我遇到問題時纔會發生這種情況,這通常意味着我想查看當時發生的其他日誌,它什麼時候發生,線程記錄的最後一件事是什麼,並且之後產生了錯誤。 –

3

如果它的* nix我會嘗試kill -3 <PID>,但那麼你需要知道進程ID,也許你沒有訪問控制檯?

+0

是的。訪問控制檯並獲取進程ID是「kill」方法的問題。我上面提到的方法沒有這些缺點。 –

0

我建議你在暫存環境中進行所有堆分析(如果存在這樣的env),然後反映在生產(如果有)上調整生產環境所需的應用程序服務器。如果您需要轉儲來分析應用程序的內存使用情況,那麼也許您應該考慮對其進行分析以獲得更好的分析。

堆轉儲通常由於內存泄漏和內存管理不良導致OutOfMemoryExceptions生成。

檢查您的應用程序服務器的文檔,大多數現代服務器都具有在運行時生成轉儲的方法,但前面提到的正常原因除外,但生成的轉儲可能是供應商特定的。

+0

我瞭解獲取線程轉儲的開銷,但要清楚瞭解生產環境中發生的情況,我們需要此功能。我們使用glassfish應用程序服務器,並且在glassfish中獲取線程轉儲沒有什麼特別的。你需要發送一個kill信號給jvm,在我給@Peter Lljenbery的回覆中提到了兩個缺點。 –

+0

明白了,那麼我會建議你使用啓用了內存轉儲的特殊版本(也許通過配置)並評估你的評估的事情,然後在完成後禁用它。這樣,您就不必擔心使用jstack或其他任何方法的含義。實際上,在這種情況下,jstack可以。你也應該檢查這個[鏈接](http://docs.oracle.com/javase/6/docs/technotes/tools/share/jstack.html),它可能會有所幫助(滾動到描述部分) 。 –

+0

所以你是從我上面的描述推薦方法2?關於我上面提到的缺點,你有什麼想法?你也認爲在生產環境中執行runtime.exec()會有什麼問題嗎? –

5

在Java 8中,jcmd是首選方法。

jcmd <PID> Thread.print 

以下是從Oracle documentation片斷:

JDK 8的介紹了Java的Mission Control,Java的飛行記錄器,以及用於診斷與JVM和Java應用程序的問題jcmd效用的釋放。 建議使用最新的實用程序jcmd而不是以前的jstack實用程序來增強診斷並降低性能開銷。

但是,與應用程序一起發貨可能會導致許可問題,我不確定。

+0

這很好理解。它們是否可以通過開源線程轉儲分析器(如TDA)進行分析?它們是否包含本地線程ID? –