前提:前段时间公司服务器突然CPU飙高,久久不能下降,分析原因是因为公司有同事使用了JDK原生自带的线程池,导致创建了大量的线程去处理任务并且一直处于等待状态,解决:结合Linux命令+JDK命令一块分析并定位问题进行排查,以下说说我的解决思路:
1、先用 top 命令来查看CPU占用最高的那个程序 找出它的 进程ID也就是 PID
2、使用 ps -ef 或者 jps 命令来进行下一步定位,得知是怎样的一个程序给我们惹事
(ps -ef | grep pid | grep -v grep)(jps -l | grep pid 或者关键字)
3、定位到具体线程或者代码 ps -mp 进程ID -o THREAD,tid,time
-m 显示所有线程
-p pid 进程使用cpu的时间
-o 该参数后是用户自定义格式
4、将需要的线程ID转换为16进制格式(注意要英文小写)
5、jstack 进程ID(pid) | grep 线程ID(tid)-A60 (打印前60行)