zoukankan      html  css  js  c++  java
  • JVM调优指令

    1. jps

      查看正在运行的JVM进程

    2. jstat

      监视虚拟机运行时状态信息,显示虚拟机进程中的类装载、内存、垃圾收集、JIT编译等数据

    3. jmap

      生成heap dump文件,除了这个命令还可以配置-XX:+HeapDumpOnOutOfMemoryError参数让虚拟机出现OOM时自动生成dump文件。此外还能查询finalize执行队列、Java堆和永久代的详细信息、如当前使用率、当前使用的哪种收集器

    4. jhat

      与jmap搭配使用,分析jmap生成的dump,它内置一个微型的HTTP/HTML服务器,生成dump分析结果后,可以在浏览器中查看。但一般不会直接在服务器上进行分析,因为这是一个很耗时和耗费资源的过程,一般生成dump文件后,复制到本地或其他机器上进行分析

    5. jstack

      生成java虚拟机当前时刻的线程快照,包括虚拟机内部每一条线程正在执行的方法堆栈的集合,当出现长时间卡顿时,用来分析,是否是线程死锁,死循环,请求外部资源等问题。

      5.1 线程状态信息

      NEW,未启动的。不会出现在Dump中

      RUNNABLE,在虚拟机内执行的

      BLOCKED,受阻塞并等待监视器锁

      WAITING,无限等待另一个线程执行特定操作

      TIMED_WATING,有时限的等待另一个线程的特定操作

      TERMINATED,已退出的

      5.2 调用修饰

      locked<地址> 使用synchronized申请对象锁成功,Monitor的拥有者

      waiting to lock<地址> 使用synchronized申请对象锁失败,进入阻塞队列

      waiting on <地址> 使用synchronized申请对象锁成功,释放锁在等待集合中等待

      parking to wait for <地址> 不通过监视器在对象上阻塞,JUC下比如LockSupport

      5.3 线程动作,线程状态产生的原因

      runnable,状态为RUNNABLE

      in Object.wait(),等待区等待,状态为WAITING或TIMED_WAITING

      waiting for monitor entry,进入阻塞队列,状态为BLOCKED

      waiting on condition,等待一个条件的发生,比如调用Thread.sleep(),或者等待IO

      5.4 案例分析

      建议大家自己试一下,先jps查看进程id,然后 jstack -l pid_Id 可以看到很多信息

      5.4.1 锁竞争

      代码:

    private static final Object lock1 = new Object();
    private static final Object lock2 = new Object();
    
    
    public static void main(String[] args) {
        test1();
    }
    
    //测试锁等待
    private static void test1() {
        new Thread(()->{synchronized (lock1){while(true){}}},"线程1").start();
        new Thread(()->{synchronized (lock1){}},"线程2").start();
    }

      执行结果:

      

      5.4.2 持续运行的IO

      IO操作可能导致,线程状态为RUNNABLE,但一直等待。比如堆栈信息中有SocketInputStream或SocketImpl上,socketRead0等IO调用方法,调用栈中包含了jdbc相关包,很可能发生了数据库死锁

      5.4.3 死锁

      代码:

    private static final Object lock1 = new Object();
    private static final Object lock2 = new Object();
    
    
    public static void main(String[] args) {
        test2();
    }
    
    //测试死锁
    private static void test2() {
        new Thread(() -> {
            synchronized (lock1) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ignore) {
                    //;
                }
                synchronized (lock2){}
            }
        }, "线程1").start();
        
        new Thread(() -> {
            synchronized (lock2) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ignore) {
                    //;
                }
                synchronized (lock1){}
            }
        }, "线程2").start();
    }

      执行结果:

      

       还能自己检测到死锁信息

      

    6. jinfo

      实时查看和调整虚拟机运行参数。

    参考:

    Java虚拟机(五):JVM调优命令

    Java命令学习系列(二)——Jstack

    人生就像蒲公英,看似自由,其实身不由己。
  • 相关阅读:
    uva111 History Grading
    UVA 10100Longest Match
    UVA 147Dollars
    归并排序模板
    找礼物(find)
    水流(water)dfs
    细菌(disease) 位运算
    单词接龙
    关于jquery的each遍历,return只终止当前循环,不好使的解决办法
    jquery中ajax回调函数使用this
  • 原文地址:https://www.cnblogs.com/walker993/p/14825967.html
Copyright © 2011-2022 走看看