• jstat的使用和死锁问题


    1.jstat命令可以查看堆内存各部分的使用量,以及加载类的数量
    1.1 查看当前进程class类加载统计
     
    说明:
    Loaded:加载class的数量
    Bytes:所占用空间大小
    Unloaded:未加载数量
    Bytes:未加载占用空间
    Time:时间 
     
     

    1.2 查看编译统计

    说明:
    Compiled:编译数量。
    Failed:失败数量
    Invalid:不可用数量
    Time:时间
    FailedType:失败类型
    FailedMethod:失败的方法 

    1.3 查看垃圾回收统计

    说明:

    S0C:第一个Survivor区的大小(KB)

    S1C:第二个Survivor区的大小(KB)

    S0U:第一个Survivor区的使用大小(KB)

    S1U:第二个Survivor区的使用大小(KB)

    EC:Eden区的大小(kB)

    EU:Eden区的使用大小(KB)

    OC:Old区的大小(KB)

    OU:Old使用 大小(KB)

    MC:方法大小(KB)

    MU:方法去使用大小(KB)

    CCSC:压缩类空间大小(KB)

    CCSU:压缩类空间使用 大小(KB)

    YGC:年轻代垃圾回收次数

    YGCT:年轻代垃圾回收消耗时间

    FGC:老年代垃圾回收次数

    FGCT:老年代垃圾回收消耗时间

    GCT:垃圾回收小号总时间

    2. 通过jstack监控JVM当中线程的运行情况 jstack 进程ID

    线程抢占CPU资源,当CPU过高时,定位线程,查看线程使用状态

    2.1 线程状态:

      初始状态:New, 线程对象创建出来后,没有调用start方法,线程处于初始状态

      运行状态:

        1.就绪状态:Readt   调用了start方法等待CPU分配资源

        2.运行撞他:RUNNING   CPU分配资源给该线程  该线程处于运行状态

      阻塞状态:

        线程获取资源,如果资源获取成功则正常运行,如果资源获取 失败,就处于阻塞状态 

      等待状态:线程手动调用wait( )方法,或者join( )方法,这些方法否是主动进入等待状态,待状态会将CPU资源让渡

            需要其他线程手动唤醒,notify(),notifyAll()唤起所有的等待线程

      超时等待状态: TIMED_WAITING  与等待状态相同,都是主动进入等待,也是需要其他线程唤醒,

             但是区别在与超时等待,如果超过了等待时间,则自动唤醒Thread.sleep(2000),

             在休眠等待时间内会将CPU资源让渡,然后等待时间结束自动进入运行状态
      终止状态DIED:线程结束之后的状态

    3. 死锁问题

    获取资源失败,导致应用程序的停止,我们可以借助jstack进行分析

    3.1 模拟死锁

    //定义资源
        private static  Object obj1=new Object();
        private static  Object obj2=new Object();
    
        //线程a:先获取到资源1,然后休眠2s,在获取资源2
        private static  class ThreadA implements Runnable{
    
            @Override
            public void run() {
                synchronized (obj1){
    
    
                System.out.println("ThreadA获取到了obj1的资源~");
                //休眠2s,因为我们要将CPU资源让渡出去,这样线程B就可以先抢占obj2的资源
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (obj2){
                        System.out.println("ThreadA获取到了obj2资源~");
                    }
                }
            }
    
        }
    
    
    private static  class ThreadB implements Runnable{
    
        @Override
        public void run() {
            synchronized (obj2){
    
    
                System.out.println("ThreadB获取到了obj2的资源~");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj1){
                    System.out.println("ThreadA获取到了obj1资源~");
                }
            }
        }
    
    }
        public static void main(String[] args) {
            new Thread(new ThreadA()).start();
            new Thread(new ThreadB()).start();
        }

    3.2 运行程序控制台效果

    3.3 使用jstak进行分析

    3.4 我们可以观察到

  • 相关阅读:
    mysql基础以优化
    Mysql建立索引基础
    Mysql(1)
    SVN学习总结
    Github
    Java Eclipse断点调试
    Java设计模式图文详解
    代理模式
    Java——动态代理技术
    Spring基本概念理解
  • 原文地址:https://www.cnblogs.com/szhhhh/p/12411523.html
Copyright © 2020-2023  润新知