dump分析死锁
1、制造死鎖場景
一段死鎖程序
public class DeadLock {public static Object lockA = new Object();public static Object lockB = new Object();public static void main(String[] args) {new ThreadA().start();new ThreadB().start();} }class ThreadA extends Thread {@Overridepublic void run() {synchronized(DeadLock.lockA) {System.out.println(Thread.currentThread().getName() + " get LockA");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}synchronized(DeadLock.lockB) {System.out.println(Thread.currentThread().getName() + " get LockB");}}} }class ThreadB extends Thread {@Overridepublic void run() {synchronized(DeadLock.lockB) {System.out.println(Thread.currentThread().getName() + " get LockB");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}synchronized(DeadLock.lockA) {System.out.println(Thread.currentThread().getName() + " get LockA");}}} }運行該程序會出現死鎖:
2、分析死鎖
2.1 使用Thread Dump
使用JDK提供的一個非常強大的性能診斷工具:Thread Dump來解決。
2.1 在Linux系統上通過執行kill -3 PID來獲取某個java進程的Thread Dump信息。
2.2 使用JDK自帶的工具:jps 來獲取執行中的java進程的PID。(或者ps -ef|grep java)
2.3 新開一個命令行窗口,執行jps獲取運行中的java進程的PID。
或者使用這種方式獲取進程ID,傳送門
然后執行:
./jstack pid > thread.txt
打開生成的thread dump文件,發現如下信息:
bingo!找到了死鎖信息,并定位到了代碼位置
2.1 使用JConsole
Jconsole是JDK自帶的圖形化界面工具,使用JDK給我們的的工具JConsole,可以通過打開cmd然后輸入jconsole打開。
1.連接到需要查看的進程
打開線程選項卡,然后點擊左下角的“檢測死鎖” 。
發現死鎖信息
總結
- 上一篇: 锻炼最佳时间
- 下一篇: 利用Arthas排查NoSuchMeth