上上周生產(chǎn)出現(xiàn)問題,記錄一下定位問題的方案,原創(chuàng)不易,歡迎關注
測試代碼:
@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);
}
}
}
}
觸發(fā):
第一種方式:
1、top找到占用CPU最多的進程
2、top -Hp pid 找出8139進程中耗用CPU最多的線程,按H,獲取每個線程的內(nèi)存情況
top -Hp 8139
3、printf "%xn" pid 將線程id轉成十六進制
4、執(zhí)行jstack命令,得到線程堆棧信息中12509這個線程所在行的后面20行
jstack 8139 |grep 30dd -A 20 >test.txt
5、將test.txt文件下載到本地,打開就能看到具體的堆棧信息,最后找出可能存在問題的代碼
這個幾個命令確實找到問題,但是整體敲下來需要一點時間,生產(chǎn)環(huán)境出現(xiàn)問題,需要爭分奪秒,不然損失很大,也可能造成數(shù)據(jù)積壓。下面推薦一個阿里大神寫的一段腳本,只需要三步就可以搞定
第二種:使用show-busy-JAVA-threads快速排查Java的CPU性能問題
下載
wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release/show-busy-java-threads
添加執(zhí)行權限
chmod +x show-busy-java-threads
啟動
./show-busy-java-threads或者 sh show-busy-java-threads
顯然,結果跟第一種一樣。你學會了嗎,哈哈