一、 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
以后有时间再仔细翻译一遭吧。