1 セットのスレッド ダンプだけでは、根本原因を突き止めるのにあまり役に立ちません。
コツは、5 秒間隔で 4 ~ 5 セットのスレッド ダンプを取得することです。そのため、最後に、アプリ サーバーでの約 20 ~ 25 秒分のアクションを含む 1 つのログ ファイルが作成されます。
チェックする必要があるのは、スタック スレッドまたは実行時間の長いトランザクションが発生したときです。すべてのスレッド ダンプは、特定のスレッド ID が Java スタック トレースの同じ行にあることを示します。簡単に言えば、トランザクション (EJB またはデータベースなど) が複数のスレッド ダンプにまたがっているため、さらに調査が必要です。
これらをSamuraiで実行すると(私自身は TDA を使用していません)、これらが赤色で強調表示されるので、すばやくクリックして問題を示す行に到達できます。
この例をここで参照してください。そのリンクの Samurai の出力画像を見てください。緑のセルは問題ありません。赤と灰色のセルを確認する必要があります。
以下の私自身の Web アプリからの Samurai の例は、5 秒から 10 秒にわたってスレッド '19' のスタック シーケンスを示しています。
> 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を使用しましたが、Samuraiとは対照的にTomcatに非常に役立ちました