jstack的运用

背景:我们经常线上遇到cpu过高,或者死循环或者锁,需要快速定位问题,这个时候就需要jstack,本文以tomcat+springBoot作为例子

1.windows 下载process explore和bash窗口

bash
jstack定位死循环实例

proceeExplore页面

jstack定位死循环实例

其他的通下面

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 得到

       
      $ jps
      12084 Bootstrap
      8004 Jps
      13304
      • * tomcat的线程就是Bootstrap *

    • 找到了,如下图,ok

    jstack定位死循环实例

  • 3.在tomcat中启动2个以上的项目,看看效果

tomcat的线程jps可以看到,名字是: Bootstrap

相关文章: