zoukankan      html  css  js  c++  java
  • 性能测试之JVM的故障排查-死锁

    死锁原因

    Java发生死锁的根本原因是:在申请锁时发生了交叉闭环申请。即线程在获得了锁A并且没有释放的情况下去申请锁B,这时,另一个线程已经获得了锁B,在释放锁B之前又要先获得锁A,因此闭环发生,陷入死锁循环。

    监控死锁

    VisualVM监控工具有明显线程死锁提醒,也可监控到发生死锁的线程、类、代码行数、数据类型。

    分析死锁

    1. VisualVM生成threaddump,查找死锁代码块内存地址
    2. VisualVM生成heapdump, 使用OQL查看被死锁对象的值和引用
    select heap.findObject("0x00000006c0276428")
    

    1. 使用OQL的另一种方法
    jmap -dump:live,file=/data/test.map <jps端口号>
    jhat /data/test.map
    浏览器访问 http://ip:7000/
    


    示例代码

    /*
     * 线程死锁等待演示
     */
    static class SynAddRunalbe implements Runnable {
        int a, b;
    
        public SynAddRunalbe(int a, int b) {
            this.a = a;
            this.b = b;
        }
        @Override
        public void run() {
            synchronized (Integer.valueOf(a)) {
                synchronized (Integer.valueOf(b)) {
                    System.out.println(a + b);
                }
            }
        }
        
    public static void main(String[] args) throws Exception {
        for (int i=0;i< 100; i++) {
            new Thread(new SynAddRunalbe(1, 2)).start();
            new Thread(new SynAddRunalbe(2, 1)).start();
        }
    }
    

    扫一扫,关注我

  • 相关阅读:
    python Database Poll for SQL SERVER
    SQLAlchemy表操作和增删改查
    flask动态url规则
    flask配置管理
    一个Flask运行分析
    Function Set in OPEN CASCADE
    Happy New Year 2016
    Apply Newton Method to Find Extrema in OPEN CASCADE
    OPEN CASCADE Multiple Variable Function
    OPEN CASCADE Gauss Least Square
  • 原文地址:https://www.cnblogs.com/hally/p/13862354.html
Copyright © 2011-2022 走看看