jstack定位死循环实例

当线上遇到CPU过高或死循环情况,jstack成为快速定位问题的工具。本文通过Windows和Linux环境,演示如何使用jstack结合Tomcat和SpringBoot应用,找出高CPU线程并定位死循环。包括下载Process Explorer,使用jps、jstack命令,以及在Eclipse和Tomcat中启动项目进行实战操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值