单独一套线程转储不会对帮助解决问题的根本原因有所帮助。
诀窍是每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