螺纹突降分析工具/方法 [已关闭]

2022-08-31 15:28:48

当Java应用程序挂起时,您甚至不知道导致这种情况的用例并希望进行调查,我知道线程转储可能很有用。

但是,我们如何轻松地从线程转储中获取有用的数据来查找问题所在呢?我一直在使用的服务器应用程序会产生非常长的线程转储,因为它是一个EJB架构,线程转储包含许多我不确定我应该查看的容器线程(即没有运行我的应用程序代码的线程,而是JBoss的代码)。

昨天我尝试了线程转储分析器工具。该工具绝对比在文本编辑器中查看原始线程转储更好,因为您可以过滤掉您不感兴趣的线程,查看线程列表,单击线程以查看其详细信息,比较线程转储以查找长时间运行的线程等。

但是仍然有太多的数据需要分析 - 近300个线程。我不知道有什么标准可以用来过滤掉所有的JBoss线程,对此我不感兴趣。我不确定我是否应该查看当前仅处于“可运行”状态的线程,或者“等待条件”和“在 Object.wait 中”也很重要。

您通常会遵循什么方法以及您通常使用的工具是什么?


答案 1

我知道这是一个老问题,但我刚刚写了一个工具来帮助使长线程转储更具可读性。

Java 线程转储分析工具

此工具将具有相同堆栈跟踪的线程组合在一起,并允许您仅显示处于特定状态(例如 RUNNABLE 或 BLOCKED)的线程。

这使得在数十个或数百个JBoss线程中找到有趣的线程变得更加容易,这些线程花费大部分时间在代码中的同一位置等待工作,因此都具有相同的堆栈跟踪。


答案 2

仅靠一组线程转储对于找到根本原因不会太有帮助。

诀窍是以 5 秒的间隔获取 4 或 5 组线程转储。因此,最后您将拥有一个日志文件,该文件在应用程序服务器上具有大约20-25秒的操作时间。

您要检查的是,当发生卡住的线程或长时间运行的事务时,所有线程转储都将显示某个线程ID位于java堆栈跟踪中的同一行。简单来说,事务(例如在 EJB 或数据库中)跨越多个线程转储,因此需要更多的调查。

现在,当您通过Samurai运行这些时(我自己没有使用过TDA),它将以红色突出显示这些内容,以便您可以快速单击它并转到显示问题的行。

在此处查看此示例。查看该链接中的武士输出图像。绿色单元格正常。红色和灰色细胞需要观察。

下面我自己的 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线程转储分析器,它对Tomcat非常有用,而不是武士。