码迷,mamicode.com
首页 > 其他好文 > 详细

JVM调优指令

时间:2021-06-02 16:01:06      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:结果   过程   obj   上进   puts   hive   io操作   finalize   zed   

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

JVM调优指令

标签:结果   过程   obj   上进   puts   hive   io操作   finalize   zed   

原文地址:https://www.cnblogs.com/walker993/p/14825967.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!