如何通过已知的PID / TID获取JVM线程名称/ id

时间:2014-10-24 12:41:45

标签: java tomcat jvm

昨天我们在Debian上运行的tomcat 6服务器出现了一个奇怪的问题:我们有第二次长时间冻结/中断,长度随着时间的推移而增加。在冻结期间,我们所有的独立网络应用程序都没有响应。中断具有非常高的规律性,在一小时的过程中,中断阶段变得比活动阶段更长,直到我们重新启动解决问题的服务器。现在我们想知道它是什么或者找到解决方案,以便在它再次发生时找出它是什么!

在每个中断阶段,24个核心中的一个被一个tomcat线程100%使用,因此我们假设线程正在做的任何事情都冻结了整个tomcat。遗憾的是,我们不知道那个主题是在做什么。今天我研究了一个获得java线程TID的解决方案,我找到了一个很棒的解决方案:Obtaining the thread ID for Java threads in Linux

将它放在我们广泛的日志文件条目中并找到JVM线程就足够了,但是如果它是一个不完全在我们控制之下的线程呢?那么有一个同步的TID / Java-Thread-ID快照的烦恼怎么样?这导致了我的核心问题:

有没有办法从已知的Linux TID获取JVM线程名称/ id?
我的希望虽然很小,但可能存在对JVM的交叉过程调用或我尚未考虑的其他想法。

我们在该服务器上运行了Yourkit分析器,但在中断阶段,它无法记录任何内容,因此我们无法找到有问题的线程。

1 个答案:

答案 0 :(得分:8)

使用jstack <PID>

"Thread-0" prio=10 tid=0x00002aaab01c3800 nid=0x246d runnable [0x00000000423c7000]
    ^ name             ^ Java thread id       ^ native (OS) thread id