Java一个案例学会使用Java VisualVM

今天自己写了个死锁,打算用Visual IVM分析一下,上网找教程,全部都是教你怎么安装和简单介绍,而我,是看不懂里面写的火星文才百度的啊,所以,只能自己捣鼓了,最后我发现了一丝蛛丝马迹,有助于分析死锁!!!

测试代码,不看代码可以看注释

/**
 * 下面写了一个死锁
 * 1. thread1锁了A对象,休眠; 
 * 2. thread2锁了B对象等待A对象;
 * 3. thread1醒来,等待B对象
 * 4. 大家互相等待,死锁
 */
public class DeadLockDemo {
    private static String A = "A";
    private static String B = "B";

    public static void main(String[] args){
        new DeadLockDemo().deadLock1111();
    }
        
    private void deadLock() {
        Thread t1 = new Thread(new Runnable(){
            @Override
            public void run(){
                synchronized (A){
                    try {
                        System.out.println("sleep start");
                        Thread.currentThread().sleep(5000);
                        System.out.println("sleep end");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (B){
                        System.out.println("thread1 running");
                    }
                }
            }
        });
        Thread t2 = new Thread(new Runnable(){
            @Override
            public void run() {
                try {
                    Thread.currentThread().sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (B){
                    synchronized (A){
                        System.out.println("thread2 running");
                    }
                }
            }
        });
        t1.setName("AAAAAAAAAAAAAAAAA");
        t2.setName("BBBBBBBBBBBBBBBBB");
        t1.start();
        t2.start();
    }
}

执行结果,然后卡主了,红点表示程序一直在运行(线程在互相等待)

接下来,就到了我们visual IVM出马了!!

来,我们想象这样一个场景,现在我们运行了上面这个项目,我们不知道有死锁可能发生,突然一个用户反映说,程序卡死不懂了,怎么办?(大脑思考:卡死 → 服务停止了 → 死锁) ,哦,可能项目死锁了,那我们打开vimsual ivm看看能否找出一些蛛丝马迹!!!

打开ivm,发现一个明显是自己项目里的文件名出现,出于好奇点开

点开后,打开线程面板页,哟,检测到死锁了,点开dump

扫描二维码关注公众号,回复: 4646737 查看本文章

拉到最后,重点分析这部分内容

为了明显,我在代码修改了线程的名称为AAAA..和BBBB..。简单翻译上面的内容,发现一个java级别的死锁,线程BBB等待一个被线程AAA持有的String对象,线程AAA也等待线程BBB持有的对象那个,所以互锁了!!,虽然没有写是哪个共享资源被锁了,但从这份报告我们知道这些信息:死锁发生在哪个类(仔细看上图,第几行也知道) - 死锁的数量 - 死锁锁了哪个对象(这里所的是String,所以看上去不起眼,如果所的是Student类的话,一眼就能定位到了吧)

最后,如果大家有更好的死锁分析工具及教程推荐,欢迎写在评论区

猜你喜欢

转载自blog.csdn.net/qq_38056704/article/details/85165681