2013-04-04 69 views
4

我正在檢查Java線程轉儲,從部分應用程序(部署在JBoss 4.2.3上)因鎖定數據庫查詢而鎖定。有6個線程正在執行各種查詢,我想確定哪個是第一個執行的,因爲這將成爲初始原因的候選人。識別java堆棧跟蹤中最早的線程

我可以比較每個線程上的總CPU時間和用戶時間,並將最長時間的線程視爲最早的(首次運行)?或者不同的線程可能被分配不同的時間量?

E.g(簡單的例子)

Thread ajp-0.0.0.0-8009-19 (Id = 21) RUNNABLE 
    Total CPU time 100000 ms, User time 100000 ms 

    stack here... 

Thread ajp-0.0.0.0-8009-19 (Id = 200) RUNNABLE 
    Total CPU time 200000 ms, User time 200000 ms 

    stack here... 

Thread ajp-0.0.0.0-8009-19 (Id = 2590) RUNNABLE 
    Total CPU time 300000 ms, User time 300000 ms < --- THIS THREAD MUST HAVE STARTED BEFORE OTHERS 

    stack here... 
+0

您可以考慮使用一個線程轉儲分析器如 http://mchr3k.github.com/javathreaddumpanalyser/ 或 HTTP:// yusuke.homeip.net/samurai/en/index.html – Kishore 2013-04-04 10:07:33

+0

謝謝 - 但我不確定是否添加了我需要的信息(如果它在總CPU時間/總用戶時間中不存在) – 2013-04-04 10:11:07

+0

總CPU時間或總用戶時間不會給你任何有關線程年齡的信息。它只能說最低線程的年齡就是這個值。 – Kishore 2013-04-04 10:21:00

回答

1

CPU總時間或總用戶時間不給你上線的任何年齡的信息。它只能說最低線程的年齡就是這個值。

您可以考慮使用一個線程轉儲分析器如Mchr3k - Java Thread Dump AnalyserSamurai

+1

出於興趣 - 何時會發生線程A比線程B早,但線程A的CPU /用戶時間更長的情況? – 2013-04-04 10:33:58

+0

這取決於調度程序。如果線程A受CPU限制,線程B受到更多I/O限制,則調度程序可能會試探性地決定線程A需要更多CPU時間,因此其CPU時間會更長。 – Kishore 2013-04-04 10:52:47