线程CPU占用100%的问题怎么定位

测试代码:

测试代码:

@RestController@RequestMapping("/test")public class TestController {   private static Logger log = LoggerFactory.getLogger(TestController.class);   @GetMapping("/test")   public boolean test(){       Thread t1 = new Thread(new ThreadOne());       t1.setName("one");       Thread t2 = new Thread(new ThreadTwo());       t2.setName("two");       t1.start();       t2.start();       return true;  }   public  class ThreadOne implements Runnable {       public void run() {           int a = 0;           while (true) {               a++;               try {                   log.info("[ThreadOne]当前a等于:{}",a);                   Thread.sleep(10);              } catch (InterruptedException e) {                   e.printStackTrace();              }          }      }  }   public  class ThreadTwo implements Runnable {       public void run() {           long a = 0L;           while (true) {               a++;               log.info("[ThreadTwo]当前a等于:{}",a);          }      }  }}

触发:

线程CPU占用100%的问题怎么定位

第一种方式:

1、top找到占用CPU最多的进程

线程CPU占用100%的问题怎么定位

2、top -Hp pid 找出8139进程中耗用CPU最多的线程,按H,获取每个线程的内存情况

top -Hp 8139

线程CPU占用100%的问题怎么定位

3、printf "%x\n" pid 将线程id转成十六进制

线程CPU占用100%的问题怎么定位

4、执行jstack命令,得到线程堆栈信息中12509这个线程所在行的后面20行

jstack 8139 |grep 30dd -A 20 >test.txt

线程CPU占用100%的问题怎么定位

5、将test.txt文件下载到本地,打开就能看到具体的堆栈信息,最后找出可能存在问题的代码

线程CPU占用100%的问题怎么定位

这个几个命令确实找到问题,但是整体敲下来需要一点时间,生产环境出现问题,需要争分夺秒,不然损失很大,也可能造成数据积压。下面推荐一个阿里大神写的一段脚本,只需要三步就可以搞定

第二种:使用show-busy-java-threads快速排查Java的CPU性能问题

下载

wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release/show-busy-java-threads

线程CPU占用100%的问题怎么定位

添加执行权限

chmod +x show-busy-java-threads

启动

./show-busy-java-threads或者 sh show-busy-java-threads

线程CPU占用100%的问题怎么定位

显然,结果跟第一种一样。你学会了吗,哈哈

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/113952.html

(0)

相关推荐