Java与C++之间有一睹由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。

JConsole是一款基于JMX的可视化监视,管理工具。他的主要功能是通过JMX的MBean对系统进行信息收集和参数动态调整。

1.启动JConsole

通过JDK/bin目录下的jconsole.exe 启动JConsole,或者配置了环境变量,直接在控制台上面执行 jconsole命令就会自动启动工具。

Java 怎么监控子窗口关闭 java监视和管理控制台_System


选中本地进程,点击连接,不需要用户名和口令那个是远程进程才需要的

点击不安全连接就可以进入管理界面。

Java 怎么监控子窗口关闭 java监视和管理控制台_System_02


首页就可以看到有这几个,堆内存使用量,线程,类,cpu等一些信息,接下来我们写一段实例代码来看看:

2.内存监控

代码:

/**
 * -Xms600m -Xmx600m -XX:SurvivorRatio=8
 * @author shkstart  shkstart@126.com
 * @create 2020  17:51
 */
public class HeapInstanceTest {
    byte[] buffer = new byte[new Random().nextInt(1024 * 100)];

    public static void main(String[] args) {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        ArrayList<HeapInstanceTest> list = new ArrayList<HeapInstanceTest>();
        while (true) {
            list.add(new HeapInstanceTest());
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

注意,配置好jvm堆内存参数配置:

Java 怎么监控子窗口关闭 java监视和管理控制台_java_03


这里就是可以看出堆的使用情况,以及各个分代执行的情况。

Java 怎么监控子窗口关闭 java监视和管理控制台_System_04


由于代码设置的jvm调优参数,在执行到一定情况后,会出oom的错误,这时候我们看看jconsole的图示:

Java 怎么监控子窗口关闭 java监视和管理控制台_jvm_05

3.线程监控:

死锁代码演示:

/**
 * 演示线程的死锁问题
 *
 * @author shkstart
 * @create 下午 3:20
 */
public class ThreadDeadLock {

    public static void main(String[] args) {

        StringBuilder s1 = new StringBuilder();
        StringBuilder s2 = new StringBuilder();

        new Thread(){
            @Override
            public void run() {

                synchronized (s1){

                    s1.append("a");
                    s2.append("1");

                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    synchronized (s2){
                        s1.append("b");
                        s2.append("2");

                        System.out.println(s1);
                        System.out.println(s2);
                    }

                }

            }
        }.start();


        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (s2){

                    s1.append("c");
                    s2.append("3");

                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    synchronized (s1){
                        s1.append("d");
                        s2.append("4");

                        System.out.println(s1);
                        System.out.println(s2);
                    }
                }
            }
        }).start();

    }
}

执行代码,打开jconsole,连接进程id:

Java 怎么监控子窗口关闭 java监视和管理控制台_Java 怎么监控子窗口关闭_06


点击检测死锁的按钮,工具帮我们检测是否有死锁的情况,在程序中,如果有时候出现卡顿,停止不动的情况,就要看看是否有死锁来

Java 怎么监控子窗口关闭 java监视和管理控制台_jvm_07


由此可见程序中的死锁被检测出来了。我们可以根据上面的信息去调整自己的代码,

vm概要信息:

Java 怎么监控子窗口关闭 java监视和管理控制台_jvm_08


这些不就对应着jinfo命令吗,可查看jvm信息,工具都是基于jvm命令的。

好了jconsole就到这里了,有问题的朋友,请在下方讨论,一起学习。