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} 找到进程中最高cpu的线程tid, windows通过process Explore寻找,见上面图
4.printf "%x\n" {tid} 得到16进制的tid
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 得到
$ jps12084 Bootstrap8004 Jps13304* tomcat的线程就是Bootstrap *
找到了,如下图,ok
3.在tomcat中启动2个以上的项目,看看效果