为什么要查看线程名称?
如果进程占CPU高,是哪个线程占CPU高?
业务线程创建了吗?
程序总共有多少个线程,每个线程是干什么的?
总而言之,查看线程名称会让你对程序更加了解。当然,自己的程序也可以通过日志的方式输出线程名称与线程ID的对应关系,但是,万一不是你写的程序呢?
如何查看?
以下程序都是在CentOS 7上测试的。.
OpenJDK中查看线程名称
JVM版本:OpenJDK 1.8.0_262
我写了一个Test程序,源码如下:
public class Test {
public static void main(String[] args) {
Thread thread = new Thread(new RunObj(), "HelloWord");
thread.start();
while(true)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class RunObj implements Runnable {
RunObj()
{
}
@Override
public void run() {
while(true)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
代码很简单,创建线程空跑。
我在linux上启动之后,执行:
top -H -p `pidof java`
结果如下:
可以看到名为Helloworld的线程,其他线程都是JVM自己的。
Oracle JDK中查看线程名称
如果以Oracle JDK运行,是否能用同样的方法查看线程名称呢?
JVM版本:1.8.0_333
以同样的方法运行之后, 执行:
top -H -p `pidof java`
显示结果为:
很遗憾,只看得见进程名称,看不见线程名称。
有没有办法解决呢?
有,用先用jstack 导出堆栈。执行:jstack -l `pidof java` > jstack.log。jstack会输出每个线程的名称、本地线程ID,如:
将nid转换成10进制, 执行:
[root@localhost]$ printf "%d\n" 0x12b24
76580
[root@localhost]$
总结
- OpenJDK 1.8及可以在linux系统中直接查看线程名,但是版本不低于1.80_222。
- Oracle JDK 1.8及以下版本,只能使用jstack或其他方法来对照线程名称和线程ID。