利用JStack排查死鎖問題和CPU100%問題
1、工具JStack是什么?
JStack可以顯示Java應(yīng)用程序中每個線程的堆棧跟蹤,幫助開發(fā)人員診斷線程相關(guān)的問題,比如死鎖和性能問題。通過使用JStack,開發(fā)人員可以查看線程的狀態(tài)、鎖定信息以及線程調(diào)用堆棧,從而更好地理解應(yīng)用程序的運(yùn)行狀況。
1.1命令介紹:
- jstack [-l] <pid>:這個命令會生成指定Java進(jìn)程的線程轉(zhuǎn)儲。-l選項(xiàng)會同時顯示關(guān)于鎖的附 加信息。
- jstack -F [-m] [-l] <pid>:這個命令會在Java進(jìn)程響應(yīng)時生成線程轉(zhuǎn)儲。-m選項(xiàng)會同時顯示Java和本地堆棧信息。
- jstack -m [-l] <pid>:這個命令會同時顯示Java和本地堆棧信息。
- jstack -h:這個命令會顯示幫助信息,列出所有可用的選項(xiàng)。
再其中有兩個名詞java堆棧、本地堆棧,可能有些不太理解:
- Java堆棧信息:顯示了每個線程在Java虛擬機(jī)中的調(diào)用堆棧。這些信息包括了線程當(dāng)前執(zhí)行的方法、類名等。
- 本地堆棧信息:顯示了每個線程在本地方法中的調(diào)用堆棧。本地方法是使用本地語言(如C或C++)編寫的方法,通常用于與操作系統(tǒng)或硬件交互。
2、解決死鎖問題
解決死鎖問題我們最先就要定位到哪里發(fā)生了死鎖。我先準(zhǔn)備一段一定發(fā)生死鎖的程序,然后讓他再服務(wù)器運(yùn)行,然后我們來利用工具JStack來定位死鎖。
public class Demo {
static Lock lock1 = new ReentrantLock();
static Lock lock2 = new ReentrantLock();
public static void deathLock() {
Thread t1 = new Thread() {
@Override
public void run() {
try {
lock1.lock();
System.out.println(Thread.currentThread().getName() + " get the lock1");
Thread.sleep(1000);
lock2.lock();
System.out.println(Thread.currentThread().getName() + " get the lock2");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread t2 = new Thread() {
@Override
public void run() {
try {
lock2.lock();
System.out.println(Thread.currentThread().getName() + " get the lock2");
Thread.sleep(1000);
lock1.lock();
System.out.println(Thread.currentThread().getName() + " get the lock1");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
//設(shè)置線程名字,方便分析堆棧信息
t1.setName("mythread-jay");
t2.setName("mythread-tianluo");
t1.start();
t2.start();
}
public static void main(String[] args) {
deathLock();
}
}再代碼中線程“mythread-jay”持有鎖lock1等待lock2,"mythread-tianluo"線程持有l(wèi)ock2等待lock1 。那么這兩個線程就會嘗試死鎖。互相等待。

此時我們通過jps命令查看這個進(jìn)程的進(jìn)程號:

那么此時我們得知了進(jìn)程號就可以 使用JStack工具了。

那么我們就得到了一大串的字符描述進(jìn)程執(zhí)行情況,那么我們?nèi)フ谊P(guān)于這兩個線程的信息,由下面兩張圖我們可以看出兩個線程都處于Wait狀態(tài),造成了死鎖的情況,這個工具原原本本的給我們展示出來了,那我們也就知道了原因,就可以著手解決了:


3、解決CPU100%問題
造成CPU100%問題的原因有很多種,無限循環(huán)、過多的線程、大量的計算等都有可能,那么我們這次通過無限循環(huán)來達(dá)到CPU100%效果。
那么我們看到CPU百分百,我們可以使用top命令查看哪個進(jìn)程占用CPU過高。
top, 我們看到進(jìn)程號為10413的java進(jìn)程CPU利用率高達(dá)96.7%

那么得知是這個進(jìn)程出的問題,那么我們就進(jìn)一步深入的去看是這個進(jìn)程中哪些線程導(dǎo)致的問題了。 使用命令top -Hp <PID>,一看是線程號為10548的線程搞得鬼,那么我們就可以使用JStack工具對這個線程進(jìn)行檢查了。

使用 jstack 10548 命令, 得到這個線程的信息,我們可以觀察得到這個線程是為數(shù)不多處于RUNNABLE狀態(tài)的線程,他正在執(zhí)行Demo1Applocation類的第27行,那么這個第27行也正是無限循環(huán)所在。那么這個罪魁禍?zhǔn)滓舱业搅恕?/p>

以上就是利用JStack排查死鎖問題和CPU100%問題的詳細(xì)內(nèi)容,更多關(guān)于JStack排查死鎖和CPU100%的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Javaweb實(shí)現(xiàn)上傳下載文件的多種方法
本篇文章主要介紹了Javaweb實(shí)現(xiàn)上傳下載文件,有多種實(shí)現(xiàn)方式,需要的朋友可以參考下。2016-10-10
Java Swing GridBagLayout網(wǎng)格袋布局的實(shí)現(xiàn)
這篇文章主要介紹了Java Swing GridBagLayout網(wǎng)格袋布局的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Spring Boot+Mybatis+Druid+PageHelper實(shí)現(xiàn)多數(shù)據(jù)源并分頁的方法
這篇文章主要給大家介紹了關(guān)于Spring Boot+Mybatis+Druid+PageHelper實(shí)現(xiàn)多數(shù)據(jù)源并分頁的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們來一起看看吧2018-05-05

