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

我正在检查一个Java线程转储,从我的应用程序的一部分(部署在JBoss 4.2.3上)由于阻止数据库查询而被锁定.有6个线程都在执行各种查询,我想确定哪个是第一个执行,因为这将是初始原因的候选者.

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

例如(简单例子)

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...

解决方法:

总CPU时间或总用户时间不会提供有关线程年龄的任何信息.它只能说线程年龄至少是这个值.

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

上一篇:java – 无法在JBoss 6.4 EAP中部署Spring Boot EAR


下一篇:如何在Java中设置TLS1.2版本