JDK的可视化工具(JConsole、VisualVM)

        JDK中除了提供大量的命令行工具外,还有两个功能强大的可视化工具:JConsole和VisualVM,这两个工具是JDK的正式成员。

一、JConsole:Java监视与管理控制台

        1、启动JConsole:双击运行jdk/bin目录下的jconsole.exe文件,会自动搜索出本机运行的所有虚拟机进程。可以双击其中一个开始进行监控,也可以连接远程服务器进行监控。

                    JDK的可视化工具(JConsole、VisualVM)_第1张图片

        双击进入一个进程后,可以看到有概览、内存、线程、类、VM概要、MBean6个标签页,概览也包括4中信息的曲线图,纵观全局,其他标签页显示该种类下更加详细的信息。

                JDK的可视化工具(JConsole、VisualVM)_第2张图片

    2、内存监控(相当于可视化的jstat命令)

        代码:

/**
 * JVM参数:-Xms100m -Xmx100m -XX:+UseSerialGC  -XX:+PrintGCDetails
 */
public class MonitoringTest {


    public static void main(String[]args)throws Exception{
        fillHeap(1000);
        //System.gc();
    }

    /**
     *内存占位符对象,一个OOMObject大约占64KB
     */
    static class OOMObject{
        public byte[] placeholder =new byte[64*1024];
    }

    public static void fillHeap(int num)throws InterruptedException{
        List list =new ArrayList();
        for(int i=0;i

        我们通过JConsole对该进程进行内存监控,可以看到Eden区的运行趋势呈折现状(进行YGC),而整个堆是一条像上的平滑曲线。

        JDK的可视化工具(JConsole、VisualVM)_第3张图片

    虚拟机启动参数只限制了Java堆为100MB,没有指定-Xmn参数(新生代大小),上图显示Eden空间为27328KB,因为没有设置-XX:SurvivorRadio(Eden和Survivor的比例)参数,所以Eden与Survivor空间比例为默认值8:1,整个新生代空间大约为27328KB×125%=34160KB。

    3、线程监控(当于可视化的jstack命令)

        遇到线程停顿时可以使用这个页签进行监控分析。线程长时间停顿的主要原因主要有:等待外部资源(数据库连接、网络资源、设备资源等)、死循环、锁等待(活锁和死锁)。

    代码:

/**
 * 死锁检测演示
 */
public class MonitoringTest02 {


    public static void main(String[] args) throws InterruptedException {

        final Object lock1 = new Object();
        final Object lock2 = new Object();

        Thread t1 = new Thread(new Runnable() {
            public void run() {
                synchronized (lock1){
                    try {
                        Thread.sleep(100);
                        synchronized (lock2){}
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        },"t1");

        Thread t2 = new Thread(new Runnable() {
            public void run() {
                synchronized (lock2){
                    try {
                        Thread.sleep(100);
                        synchronized (lock1){}
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        },"t2");

        t1.start();
        t2.start();

        Thread.sleep(Integer.MAX_VALUE);

    }

}

    我们通过“线程”标签页,可以看到当前执行的线程,我们可以点击检测死锁来看程序中是否有死锁存在

                JDK的可视化工具(JConsole、VisualVM)_第4张图片

二、VisualVM:多合一故障处理工具

        VisualVM是目前JDK发布的功能最强大的运行监视和故障处理程序。它除了运行监视、故障处理外,还提供了很多其他方面的功能,如性能分析。而且VisualVM还具备插件扩展功能。

    1、启动VisualVM:与jconsole类似,它也在jdk/bin目录下,双击jvisualvm.exe启动

                JDK的可视化工具(JConsole、VisualVM)_第5张图片

    2、安装插件:可以通过工具->插件->可用插件进行安装:(可根据自己的需要进行安装)

                JDK的可视化工具(JConsole、VisualVM)_第6张图片

    默认的不可用的话,可以访问https://visualvm.github.io/pluginscenters.html,找到自己的版本然后如下替换即可:

            JDK的可视化工具(JConsole、VisualVM)_第7张图片

    3、选择进程后页面的标签页根据插件安装不同显示可能不一致,但是概述、监视、线程、MBeans和JConsole类似。

        JDK的可视化工具(JConsole、VisualVM)_第8张图片

    4、生成、浏览堆转储快照:在监视页面下点击堆dump。打开外部dump文件:文件->载入

        JDK的可视化工具(JConsole、VisualVM)_第9张图片 ==== 》JDK的可视化工具(JConsole、VisualVM)_第10张图片

    5、分析程序性能

        在Profiler页签中,VisualVM提供了程序运行期间方法级的CPU执行时间分析以及内存分析,做Profiling分析肯定会对程序运行性能有比较大的影响,所以一般不在生产环境中使用这项功能。
要开始分析,先选择“CPU”和“内存”按钮中的一个,然后切换到应用程序中对程序进行操作,VisualVM会记录到这段时间中应用程序执行过的方法。如果是CPU分析,将会统计每个方法的执行次数、执行耗时;如果是内存分析,则会统计每个方法关联的对象数以及这些对象所占的空间。分析结束后,点击“停止”按钮结束监控过程

                JDK的可视化工具(JConsole、VisualVM)_第11张图片

 

源代码:https://gitee.com/itcaofanqi/CaoFanqiStudyRepository/tree/master/stujvm

资料:周志明《深入理解Java虚拟机》

转载于:https://my.oschina.net/caofanqi/blog/3015749

你可能感兴趣的:(JDK的可视化工具(JConsole、VisualVM))