记录该方法是因为我在开发基于 Java Agent 的监控时,根据物理机的线程 id 来匹配 JVM 线程转储中的线程时,发现 JVM 中的线程 id 并不等于物理机上的线程 id,本文简要记录。
首先与 Thread.getId()
相关的源码如下:
1 | /* |
根据以上源码,可以看出,Java 内部的线程 id 与底层操作系统的线程 id 无关,Java 中在每次创建线程时使用同步方法 nextThreadID
对静态变量 threadSeqNumber
加一的值作为新生成的线程的 id,对于底层平台的线程 id,我们在线程转储中可以看到,其中 nid=0x7dc8
就是使用十六进制表示的底层平台的线程 id。参见:find out the correspondence between the tid/nid of Java threads as shown from jstack/JMX, on HotSpot/Linux · GitHub。
我们利用以上映射关系,实现了基于 top 命令的高 CPU 使用率 JVM 线程定位。