jconsole.exe 是java自带的一个可用来监控内存,线程等信息的可视化小工具
在java安装bin目录下
写个小程序,来玩一下这个程序,主要看堆内存变化情况
public class JconsoleTest { //定义b1是为了增大类的占用空间,使jconsole的视图变化更明显,这里定义的是128kb //情况一: byte[] b1 = new byte[128 * 1024]; //情况二: // public JconsoleTest() { // byte[] b1 = new byte[128 * 1024]; // } public static void main(String[] args) { try { //为了在程序执行开始前,有时间打开 jconsole Thread.sleep(8000); } catch (InterruptedException e) { e.printStackTrace(); } fun(1000); } private static void fun(int n) { List<JconsoleTest> jList = new ArrayList<JconsoleTest>(); for (int i = 0; i < n; i++) { try { //程序慢点跑,否则还没打开jconsole,就结束了 Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } jList.add(new JconsoleTest()); } } }
首先情况一时,由于b1定义在成员变量将会长期存在,所以可以看见 jconsole上表现出来的堆内存使用量是持续增长的
再看情况二,将b1定义到构造方法中,他变成了局部变量,局部变量中引用数据类型,引用存在栈中,实例存在堆中。随着构造方法的结束,引用弹栈,堆中的对象会更快被回收(如果这个变量没有人引用)
VM概要信息
实际场景中可以通过这个监控软件,来对应用程序进行一些针对性的问题分析,通过经验判断出问题所在