單獨一套線程轉儲不會對幫助解決問題的根本原因有所幫助。
訣竅是每5秒鐘間隔取4或5組線程轉儲。所以最後你會有一個日誌文件,在應用服務器上有大約20到25秒的動作。
你想要檢查的是當一個卡住的線程或長時間運行的事務發生時,所有的線程轉儲都會顯示某個線程id在你的java堆棧跟蹤中的同一行。簡而言之,事務(比如在EJB或數據庫中)橫跨多個線程轉儲,因此需要更多的調查。
現在,當您通過Samurai(我本人沒有使用過TDA)運行這些代碼時,它會以紅色突出顯示這些顏色,以便您快速點擊並顯示問題。
查看this here的示例。查看該鏈接中的Samurai輸出圖像。綠色的細胞很好。紅色和灰色細胞需要觀察。從下我自己的web應用程序
武士的例子顯示了Thread'19' 跨越5跨度卡住序列 - 10秒
> Thread dump 2/3 "[ACTIVE] ExecuteThread: '19' for queue:
> 'weblogic.kernel.Default
> (self-tuning)'" daemon prio=7
> tid=07b06000 nid=108 lwp_id=222813
> waiting for monitor entry
> [2aa40000..2aa40b30]
> java.lang.Thread.State: BLOCKED (on
> object monitor) at
> com.bea.p13n.util.lease.JDBCLeaseManager.renewLease(JDBCLeaseManager.java:393)
> - waiting to lock <735e9f88> (a com.bea.p13n.util.lease.JDBCLeaseManager)
> at
> com.bea.p13n.util.lease.Lease$LeaseTimer.timerExpired(Lease.java:229)
...
> Thread dump 3/3 "[ACTIVE]
> ExecuteThread: '19' for queue:
> 'weblogic.kernel.Default
> (self-tuning)'" daemon prio=7
> tid=07b06000 nid=108 lwp_id=222813
> waiting for monitor entry
> [2aa40000..2aa40b30]
> java.lang.Thread.State: BLOCKED (on
> object monitor) at
> com.bea.p13n.util.lease.JDBCLeaseManager.renewLease(JDBCLeaseManager.java:393)
> - waiting to lock <735e9f88> (a com.bea.p13n.util.lease.JDBCLeaseManager)
> at
> com.bea.p13n.util.lease.Lease$LeaseTimer.timerExpired(Lease.java:229)
更新
我最近使用了Java Thread Dump Analyzer提到的in this answer,它對於Tomcat而言非常有用,而非Sa murai
另請參閱https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=2245aa39-fa5c-4475-b891-14c205f7333c – oluies 2014-11-04 08:17:24
我寫了這個,它分析線程轉儲,沒有安裝必要:http://spotify.github.io/threaddump-analyzer/ – 2015-09-22 13:22:59
@JohanWalles漂亮的工具! – ycomp 2017-01-27 13:04:01