5.1 前言
有些時(shí)候我們需要查看下jvm中的線程執(zhí)行情況,比如,發(fā)現(xiàn)服務(wù)器的CPU的負(fù)載突然增 高了、出現(xiàn)了死鎖、死循環(huán)等,我們?cè)撊绾畏治瞿兀坑捎诔绦蚴钦_\(yùn)行的,沒(méi)有任何的輸出,從日志方面也看不出什么問(wèn)題,所以就需要 看下jvm的內(nèi)部線程的執(zhí)行情況,然后再進(jìn)行分析查找出原因。這個(gè)時(shí)候,就需要借助于jstack命令了,jstack的作用是將正在運(yùn)行的jvm的線程情況進(jìn) 行快照, 并且打印出來(lái)
5.2 jstack命令
jstack <pid>

5.3 使用jstack分析線程死鎖
死鎖代碼
public class DeadLock {
private static final Object obj1 = new Object();
private static final Object obj2 = new Object();
public static void main(String[] args) {
new Thread(() -> {
synchronized (obj1) {
System.out.println("線程[1]拿到了對(duì)象鎖[1]");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println("線程[1]拿到了對(duì)象鎖[2]");
}
}
}).start();
new Thread(()->{
synchronized (obj2) {
System.out.println("線程[2]拿到了對(duì)象鎖[2]");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj1) {
System.out.println("線程[2]拿到了對(duì)象鎖[1]");
}
}
}).start();
}
}
運(yùn)行改代碼

線程死鎖
從圖中看到已經(jīng)出現(xiàn)了線程死鎖
