jstack的运用
背景:我们经常线上遇到cpu过高,或者死循环或者锁,需要快速定位问题,这个时候就需要jstack,本文以tomcat+springBoot作为例子
1.windows 下载process explore和bash窗口
bash
proceeExplore页面
其他的通下面
2.linux
-
1. sudo -u tomcat jps 或者 ps -ef | grep java
-
2.找到对应进程的pid ,然后jstack -l pid > a.txt
如果报错 not response .. -F ,就是username的权限不对,可以进入/tmp文件夹查看 hsperfdata_{username} 比如 hsperfdata_tomcat
解决办法:
sudo -u tomcat + 其他命令
-
3.ps -Hp {pid} (windows ) 或者 top -H -p {pid} (适用linux,不适合mac) ,按住thrift+ P , 找到进程中最高cpu的线程tid, windows通过process Explore寻找,见上面图
-
4.printf "%x\n" {tid} 得到16进制的tid (\n 是换行,%x 是十六进制输出)
-
5.grep -A 30 {tid} a.txt
二.实战
-
1.直接在eclipse启动一个项目,然后定位 ok
-
2.在tomcat中启动一个项目,看看效果
死循环 for,看能不能定位
-
1.windows中
-
springBoot的demo中写一个循环,然后打成war包,然后启动tomcat的start.bat
@RequestMapping("/test1")
public String test1(){
System.err.println("debug demo");
int i = 1 ;
while( i>0 ){
System.err.println(i);
}
return "demo1,test1()";
}
-
jps 得到
$ jps
12084 Bootstrap
8004 Jps
13304
-
* tomcat的线程就是Bootstrap *
-
-
找到了,如下图,ok
-
-
3.在tomcat中启动2个以上的项目,看看效果
tomcat的线程jps可以看到,名字是: Bootstrap