单独一组线程转储不会太有助于找到根本原因。
诀窍是在每组之间以 5 秒的间隔进行 4 或 5 组线程转储。所以最后你会得到一个日志文件,它在应用服务器上有大约 20 - 25 秒的操作时间。
您要检查的是,当发生卡住线程或长时间运行的事务时,所有线程转储都会显示某个线程 id 在您的 java 堆栈跟踪中的同一行。简单来说,事务(比如在 EJB 或数据库中)跨越多个线程转储,因此需要更多调查。
现在,当您通过Samurai运行这些(我自己没有使用过 TDA)时,它会以红色突出显示这些,因此您可以快速单击它并进入显示问题的行。
请参阅此处的示例。查看该链接中的 Samurai 输出图像。绿色细胞很好。红色和灰色单元格需要查看。
下面我自己的 Web 应用程序中的 Samurai 示例显示了 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,它对 Tomcat 非常有用,而不是 Samurai