java
jstack
首先看一个导致死锁的例子,再结合例子说明下如何检查死锁,避免死锁的情况package cn.sw.study.common.test;/** * 死锁例子 * Created by shaowei on 2017/1/3. */public class DeadLock { public static void main(String[] args) { final Object a = new Object(); final Object b = new Object(); new Thread() { @Override public void run() { try { synchronized (a) { System.out.println('T1 got the lock of a'); Thread.sleep(1000); System.out.println('T1 was trying to get the lock of b'); synchronized (b) { System.out.println('T1 one win'); } } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); new Thread() { @Override public void run() { try { synchronized (b) { System.out.println('T2 two got the lock of b'); Thread.sleep(1000); System.out.println('T2 was trying to get the lock of a'); synchronized (a) { System.out.println('T2 win'); } } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); }}
打开cmd命令窗口,输入jsp命令,可以看到java的进程id列表,找到刚刚启动的例子进程id
再输入jstack 进程ID,可以看到所有的线程栈
栈列表最下方,可以看到Found one Java-level deadlock,打印出来的就是我们例子中两个互相等待锁的地方
通过上面jstack的方法,我们可以用来检查任意java进程的程序中死锁的情况。除了命令行的方式,我们还可以通过jdk自带的图形化工具来查看,打开jdk的bin目录,双击打开jvisualvm.exe
在左边列表中,同样需要找到刚刚启动例子的进程,然后双击打开
再选择线程tab标签,可以看到有红字显示检测到死锁,点击线程Dump可以查看详情
jdk自带的图形化工具比命令行方式直观方便,但如果是远程服务器监测,则需要借助jmx连接或jstatd连接