本文是该教程视频的笔记 https://www.bilibili.com/video/BV15T4y1y7eH
@RestController @RequestMapping("/demo01") public class Demo01Controller { private Object lockObj1 = new Object(); private Object lockObj2 = new Object(); @RequestMapping("/test") public String test() { return "success"; } /** * 死循环 */ @RequestMapping("/loop") public String loop() { System.out.println("开始循环"); while(true) { // } } /** * 死锁 */ @RequestMapping("/deadlock") public String deadlock() { //第一个线程 new Thread(() -> { synchronized (lockObj1) { try { TimeUnit.SECONDS.sleep(1); } catch (Exception e) {} synchronized (lockObj2) { System.out.println("first thread over"); } } }).start(); //第二个线程 new Thread(() -> { synchronized (lockObj2) { try { TimeUnit.SECONDS.sleep(1); } catch (Exception e) {} synchronized (lockObj1) { System.out.println("second thread over"); } } }).start(); return "success"; } }
top
很明显进程号 14325 占用CPU过高,接下来需要重点排查它了
top -p 14325 -H
占用CPU过高的是最上面的三个线程 14584、14613和14617,接下来就排查他们的情况
jstack 14325 > cpuoverflow.txt
注意:线程快照文件中的线程号是十六进制,查找的时候需要先将十进制数字转为十六进制
执行 printf "%x" 14584 输出的就是十六进制的值了
less cpuoverflow.txt
less 命令,G 跳到末尾,g 跳到开头,/ +搜索词,b 上一页,空格或回车 下一页
这一步就精准定位到了类的行号了,再接下来的工作就是排查代码逻辑了,看为什么出现CPU占用过高的问题