识别java堆栈跟踪中最早的线程

问题描述:

我正在检查Java线程转储,从部分应用程序(部署在JBoss 4.2.3上)因锁定数据库查询而锁定。有6个线程正在执行各种查询,我想确定哪个是第一个执行的,因为这将成为初始原因的候选人。识别java堆栈跟踪中最早的线程

我可以比较每个线程上的总CPU时间和用户时间,并将最长时间的线程视为最早的(首次运行)?或者不同的线程可能被分配不同的时间量?

E.g(简单的例子)

Thread ajp-0.0.0.0-8009-19 (Id = 21) RUNNABLE 
    Total CPU time 100000 ms, User time 100000 ms 

    stack here... 

Thread ajp-0.0.0.0-8009-19 (Id = 200) RUNNABLE 
    Total CPU time 200000 ms, User time 200000 ms 

    stack here... 

Thread ajp-0.0.0.0-8009-19 (Id = 2590) RUNNABLE 
    Total CPU time 300000 ms, User time 300000 ms < --- THIS THREAD MUST HAVE STARTED BEFORE OTHERS 

    stack here... 
+0

您可以考虑使用一个线程转储分析器如 http://mchr3k.github.com/javathreaddumpanalyser/ 或 HTTP:// yusuke.homeip.net/samurai/en/index.html – Kishore 2013-04-04 10:07:33

+0

谢谢 - 但我不确定是否添加了我需要的信息(如果它在总CPU时间/总用户时间中不存在) – 2013-04-04 10:11:07

+0

总CPU时间或总用户时间不会给你任何有关线程年龄的信息。它只能说最低线程的年龄就是这个值。 – Kishore 2013-04-04 10:21:00

CPU总时间或总用户时间不给你上线的任何年龄的信息。它只能说最低线程的年龄就是这个值。

您可以考虑使用一个线程转储分析器如Mchr3k - Java Thread Dump AnalyserSamurai

+1

出于兴趣 - 何时会发生线程A比线程B早,但线程A的CPU /用户时间更长的情况? – 2013-04-04 10:33:58

+0

这取决于调度程序。如果线程A受CPU限制,线程B受到更多I/O限制,则调度程序可能会试探性地决定线程A需要更多CPU时间,因此其CPU时间会更长。 – Kishore 2013-04-04 10:52:47