在开发中,当我们遇到CPU飙高的时候,想要知道是哪个线程在搞事情,就需要查看进程里面各线程占用CPU的情况,这个命令就可以帮助我们。
执行命令:
ps H -eo pid,tid,%cpu |grep 2266
2266为java进程id
执行结果如图(可以看出2276占用cpu很高),
那怎么看这个2276在我们代码所在呢,其实可以使用jstack命令查看栈信息,但是所看到里面的线程id是16进制的,这里的2276是十进制,要找到2276所对应的16进制id在哪里就需要做一个转换,再拿这个16进制去匹配就可以了,具体做法:
2276十进制转16进制,运行命令:
printf "%x \n" 2276
得到的8e4就是16进制
在执行命令:jstack 2266
d打印的信息如图,在里面就可以看见8e4对应的线程(8e4前面的0x代表的16进制)
在这个图中,可以看到这个线程id对应的代码里面报了Application.java的第9行有问题,那么再去看自己的代码就行了。