zoukankan      html  css  js  c++  java
  • 关于JVM案例分析(四)

    线程分析篇

    Java 语言能够很好的实现多线程应用程序。当对一个多线程应用程序进行调试或者开发后期做性能调优的时候,往往需要了解当前程序中所有线程的运行状态,是否有死锁、热锁等情况的发生,从而分析系统可能存在的问题。

    在 VisualVM 的监视标签内,可以查看当前应用程序中所有活动线程(Live threads)和守护线程(Daemon threads)的数量等实时信息。

    运行一段小程序,代码如下:

    复制代码
    package jvisualVM;
    
    public class MyThread extends Thread{
        
        public static void main(String[] args) {
            
            MyThread mt1 = new MyThread("Thread a");
            MyThread mt2 = new MyThread("Thread b");
            
            mt1.setName("My-Thread-1 ");
            mt2.setName("My-Thread-2 ");
            
            mt1.start();
            mt2.start();
        }
        
        public MyThread(String name) {
        }
    
        public void run() {
            
            while (true) {
                
            }
        }
        
    
    }
    复制代码

    Live threads 从11增加两个 变成13了

    Daemon threads从8增加两个 变成10了 

    VisualVM 的线程标签提供了三种视图,默认会以时间线的方式展现, 如下图:

    可以看到两个我们run的程序里启的线程:My-Thread-1 和 My-Thread-2

    另外还有两种视图分别是表视图和详细信息视图, 这里看一下每个Thread的详细视图:

    再来一段死锁的程序,看VisualVM 能否分析出来

    复制代码
    package jvisualVM;
    
    public class DeadLock {
        public static void main(String[] args) {
            Resource r1 = new Resource();
            Resource r0 = new Resource();
    
            Thread myTh1 = new LockThread1(r1, r0);
            Thread myTh0 = new LockThread0(r1, r0);
    
            myTh1.setName("DeadLock-1 ");
            myTh0.setName("DeadLock-0 ");
    
            myTh1.start();
            myTh0.start();
        }
    }
    
        class Resource {
            private int i;
        
            public int getI() {
                return i;
            }
        
            public void setI(int i) {
                this.i = i;
            }
            
        }
    
        class LockThread1 extends Thread {
            private Resource r1, r2;
        
            public LockThread1(Resource r1, Resource r2) {
                this.r1 = r1;
                this.r2 = r2;
            }
        
            @Override
            public void run() {
                int j = 0;
                while (true) {
                    synchronized (r1) {
                        System.out.println("The first thread got r1's lock " + j);
                        synchronized (r2) {
                            System.out.println("The first thread got r2's lock  " + j);
                        }
                    }
                    j++;
                }
            }
        
        }
    
        class LockThread0 extends Thread {
            private Resource r1, r2;
        
            public LockThread0(Resource r1, Resource r2) {
                this.r1 = r1;
                this.r2 = r2;
            }
        
            @Override
            public void run() {
                int j = 0;
                while (true) {
                    synchronized (r2) {
                        System.out.println("The second thread got r2's lock  " + j);
                        synchronized (r1) {
                            System.out.println("The second thread got r1's lock" + j);
                        }
                    }
                    j++;
                }
            }
        
        }
    复制代码

    打开VisualVM检测到的JVM进程,我们可以看到这个tab在闪,VisualVM已经检测到我这个package下面的DeadLock类出错了

    切换到Thread tab, 可以看到死锁了, Deadlock detected!

    另外可以点击Thread Dump 线程转储,进一步分析,在这里就不赘述了,有兴趣的读者可以自行实验。

     

  • 相关阅读:
    ros::NodeHandle成员介绍
    ros::NodeHandle成员介绍
    odom_out_and_back.cpp
    odom_out_and_back.cpp
    c++实现ros by example volume1 例子timed_out_and_back功能
    SQL语句进阶
    数据库基础(常用的SQL)
    安装Mysql
    1.初识数据库
    (MYSQL错误解决)本地计算机上的MYSQL服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止
  • 原文地址:https://www.cnblogs.com/ZJOE80/p/12298925.html
Copyright © 2011-2022 走看看