JConsole分析Java程序的运行(一)

 

一、  JConsole介绍   

      JConsole是JDK自带一款用来分析Java程序工具,只要安装了jdk,配置好路径之后,直接可以在命令行中使用打开。可以在http://openjdk.java.net/tools/svc/jconsole/ 看一下官方资料。下面以Windows系统下为例,简单介绍一下它的使用。

二、  JConsole如何使用

       1、安装JDK,如果配置了PATH路径,直接在命令框输入:jconsole ,回车,就会弹出JConsole的连接窗口;如果没有配置路径,则可以在JDK的安装目录bin文件夹下找到jconsole应用程序(图1),点击执行即可出现连接窗口。

                                                                  图(1)

                                                            图(2) JConsole 连接Java程序窗口

      从图(2)可以看出,JConsole既可以监控本地Java程序也能支持对远端Java程序的监控,还是很不错的。下面以监控本地Intellij IDEA中运行的Java程序为例,先大致介绍一下吧,注意本地的IDEA中的Java程序要保证长时间运行,否则JConsole是连接不上的,它需要监控的Java程序是进行中的。

        2、运行一个比较耗时或者一直运行的Java程序     

我在IDEA中定义了一个Person类,在构造函数中开辟一个800M的字节数组,用来看一下内存使用以及GC的情况(其实本意不是测这个,是晚上半夜做一个循环体内外new对象性能测试时,发现循环了1000遍,创建了1000个包含有800M数组的Person对象,这远远超过了我的破本内存,本来工作了一天脑子有点乱,一时没找到程序可以运行成功的原因,后来一拍大腿才认识到这些对象都是一次使用的即扔的,GC帮了大忙了,打印了一下GC日志,果然如此,后来就想着用JConsole看一下程序的运行吧)。相关代码如下:

Person类定义:

public class Person {
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person(){
       int []m = new int [1024 * 1024 * 50 * 2 * 2 ];//注意此处构造了一个800M的数组
    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

测试类代码如下: 

public class HelloWorld {
    public static void main(String[] args) {

        long start = System.currentTimeMillis();
        System.out.println("start : " + start);
        int i = 0;
        while (i < 1000) {
            Person p = new Person();
            p.setAge(i);
            p.setName("xiaoming" + i);
            // System.out.println("name = " + p.getName());
            i++;
        }
        long end = System.currentTimeMillis();
        System.out.println("end : " + end);
        System.out.println("end - start : " + (end - start));
        System.gc();
    }
}

在电脑上运行程序,执行速度会很慢,因为要频繁地创建比较大的Person对象,不断地进行GC,在程序运行过程中可以用JConsole连接,观察状态。

        3、在连接页面,本地进程可以看到测试运行类HelloWorld,选中,点击“连接(C)”;

           

初次连接,可能会慢一些,可能出现下面这个页面,等几秒钟即可:

           

           

点击“不安全的连接”,之后进入到JConsole的管理分析页面:

可以在内存标签页看到各内存区域的使用情况以及新生代、老年代GC时间,如下:

       可以根据IDEA中打印出的GC日志,与JConsole中的信息做一下比对,在这里我这个案例程序执行的时间还是太短了,最好做一个一直运行的程序测试比较好。

 具体各个地方代表的含义可以参考官方资料:https://docs.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html

       以后有时间再仔细翻译一遭吧。

猜你喜欢

转载自blog.csdn.net/qq_22076345/article/details/81212289