JVM優化之使用Jstack命令查找JVM死鎖
示例代碼
public class DeadLockDemo {private static Object lock1 = new Object();private static Object lock2 = new Object();public static void main(String[] args) {new Thread(() -> {synchronized (lock1) {try {System.out.println("thread1 begin");Thread.sleep(5000);} catch (InterruptedException e) {}synchronized (lock2) {System.out.println("thread1 end");}}}).start();new Thread(() -> {synchronized (lock2) {try {System.out.println("thread2 begin");Thread.sleep(5000);} catch (InterruptedException e) {}synchronized (lock1) {System.out.println("thread2 end");}}}).start();}
}
使用下面的命令輸出線程信息
jstack <pid>
“Thread-1” 線程名
prio=5 優先級=5
tid=0x0000028ae51d6000 線程id
nid=0x8778 線程對應的本地線程標識nid
java.lang.Thread.State: BLOCKED 線程狀態
通過輸出結果,可以看到有一個線程死鎖,Thread-0和Thread-1在進行資源的競爭,同時也輸出了資源競爭代碼所在行。