阅读 150

JVM调优指令

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

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

来源https://www.cnblogs.com/walker993/p/14825967.html

文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐