Java虚拟机-虚拟机工具

1.jps
    java process status显示本地虚拟机唯一id lvmid(local virtual machine id本地和进程id一致)
    参数:-l  打印运行的主类
    -m 打印主类运行参数

    -v  打印主类vm参数

2.jstat
   监视虚拟机运行的状态信息,类装载,内存,垃圾收集,jit编译的信息。

   元空间的本质和永久带类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。

3.jinfo

   实时查看和调整虚拟机的各项参数。

4.jmap

    生成堆转储快照。

5.jhat

   JVM heap ayalysis tool,以图形化的方式分析堆转储快照。

6.jstack

  生成虚拟机当前时刻的线程快照,定位线程出现长时间停顿的原因。

7.jconsole

  (1)内存分析

public class JConsoleTest {

    public static void main(String[] args) {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("start...");
        fill(1000);
    }

    private static void fill(int n) {
        List<JConsoleTest> list = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            list.add(new JConsoleTest());
        }
    }

}

运行这段代码,然后运行jconsole命令选择JConsoleTest这个主类,可以看到以下几个界面:






从图上可以看出,在代码运行结束之前总的堆内存,新生代,Survivor区,老年代的使用量是增长的。使用jconsole我们可以监测应用内存不同区域的使用情况。

(2)线程监控

public class ThreadTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        sc.next();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true) {

                }
            }
        }, "whileTrue").start();

        sc.next();
        testWait(new Object());
    }


    private static void testWait(final Object obj) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (obj) {
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }, "wait").start();
    }
}

选择上面页面的线程选项卡:


从上图我们可以知道main线程在等待用户输入,但线程还是RUNNABLE状态。


whileTrue线程处于空循环状态。


wait线程处于等待状态。

(3)死锁

jconsole可以检测死锁。

public class DeadLock implements Runnable {
    private Object obj1;
    private Object obj2;

    public DeadLock(Object obj1, Object obj2) {
        this.obj1 = obj1;
        this.obj2 = obj2;
    }

    @Override
    public void run() {
        synchronized (obj1) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            synchronized (obj2) {
                System.out.println("something");
            }
        }
    }

}

public class DeadLockTest {
    public static void main(String[] args) {
        Object obj1 = new Object();
        Object obj2 = new Object();

        new Thread(new DeadLock(obj1, obj2)).start();
        new Thread(new DeadLock(obj2, obj1)).start();
    }

}

运行代码,观察jconsole:


检测到了死锁发生在Thread-1和Thread-2线程之间。

猜你喜欢

转载自blog.csdn.net/qq_22866497/article/details/80413734