记一次linux经过jstack定位CPU使用太高问题或排查线上死锁问题

1、java定位进程java

在服务器中终端输入命令:top服务器

能够看到进程ID,为5421的cpu这列100多了。spa

记下这个数字:5421线程

 

2、定位问题进程对应的线程

 

而后在服务器中终端输入命令:top -Hp 5421blog

做用是查看里程内部线程资源占用状况。5421为第二步获取到的进程id进程

 能够看到第一行cpu占用特别高,就是它了。记住,此时第一列PID是线程ID:5463资源

注意这个ID是十进制,可是java线程堆栈是采用是16进制。那么咱们转换一下。循环

printf "%x\n" 5463终端

输出结果:grep

1557

 

3、经过jstack命令找到线程对应代码

 

如今咱们须要用到以前的进程ID(5421)和线程的16进制数字(1557)。

在服务器中终端输入命令:jstack -l 5421|grep 1557 -C 8

可看到线程处于运行状态,代码在BugDemoController类的17行,也就是咱们的循环所在行。

这里解释一下grep后页-C 8意思是显示查找目标行的先后8行,不加的话就只有一行,可能一时看不出问题来。

固然你也能够更改一下:

-A 8后8行

-B 8前8行

PS:本例方法也可用于排查线上死锁问题。

相关文章
相关标签/搜索