1,利用top命令,查看占用CPU资源最高的进程,注意是进程
如下:top
2,根据进程号获取占用资源最高的线程号
top -Hp pid
其中-H表示线程模式,-p表示pid监控,pid为进程号。
3,将十进制的线程号转化为16进制
利用printf命令将10进制转化为16进制
printf %x 4816
结果:12d0
4,查找问题代码位置
jstack 4806|grep 12d0
结果如下:
"test thread" #8 prio=5 os_prio=0 tid=0x00007f280819e000 nid=0x12d0 runnable [0x00007f280d9a4000]
也可以具体打印出jstack查找代码位置,如下所示:
"test thread" #8 prio=5 os_prio=0 tid=0x00007f280819e000 nid=0x12d0 runnable
.............................................................................
at com.sparker.SimpleApp.lambda$main$0(SimpleApp.java:31)
at com.sparker.SimpleApp$$Lambda$1/250421012.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
5,查看源码,对应System.out.println("running");部分即为占用cpu资源的地方。
Thread thread = new Thread(() -> {
while (true) {
System.out.println("running");
}
});
thread.setName("test thread");
thread.start();