zl程序教程

您现在的位置是:首页 >  其他

当前栏目

JVM-JConsole:Java监视与管理控制台(windows)

2023-03-20 15:34:37 时间

JConsole是什么?

JConsole(Java Monitoring and Management Console)是一款基于JMX(Java Manage-mentExtensions)的可视化监视、管理工具。

JConsole干什么用?

它的主要功能是通过JMX的MBean(Managed Bean)对系统进行信息收集和参数动态调整。JMX是一种开放性的技术,不仅可以用在虚拟机本身的管理上,还可以运行于虚拟机之上的软件中,典型的如中间件大多也基于JMX来实现管理与监控。虚拟机对JMXMBean的访问也是完全开放的,可以使用代码调用API、支持JMX协议的管理控制台,或者其他符合JMX规范的软件进行访问。

测试代码

class OOMObject {
    public byte[] placeholder = new byte[64 * 1024];

    public static void fillHeap(int num) throws InterruptedException {
        List<OOMObject> list = new ArrayList<OOMObject>();
        for (int i = 0; i < num; i++) {
// 稍作延时,令监视曲线的变化更加明显
            Thread.sleep(50);
            list.add(new OOMObject());
        }
        System.gc();
    }

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

}

配置

-Xms100m -Xmx100m -XX:+UseSerialGC
-Dcom.sun.management.jmxremote

使用

进入jdk bin 运行 jconsole.exe

运行进程进行连接

注意:运行异常

Exception in thread "VMPanel.connect" java.lang.InternalError: Remote thread failed for unknown reason
  at sun.tools.attach.WindowsVirtualMachine.enqueue(Native Method)
  at sun.tools.attach.WindowsVirtualMachine.execute(WindowsVirtualMachine.java:96)
  at sun.tools.attach.HotSpotVirtualMachine.executeCommand(HotSpotVirtualMachine.java:261)
  at sun.tools.attach.HotSpotVirtualMachine.executeJCmd(HotSpotVirtualMachine.java:243)
  at sun.tools.attach.HotSpotVirtualMachine.startLocalManagementAgent(HotSpotVirtualMachine.java:204)
  at sun.tools.jconsole.LocalVirtualMachine.loadManagementAgent(LocalVirtualMachine.java:239)
  at sun.tools.jconsole.LocalVirtualMachine.startManagementAgent(LocalVirtualMachine.java:98)
  at sun.tools.jconsole.ProxyClient.tryConnect(ProxyClient.java:333)
  at sun.tools.jconsole.ProxyClient.connect(ProxyClient.java:313)
  at sun.tools.jconsole.VMPanel$2.run(VMPanel.java:294)
Exception in thread "VMPanel.connect" java.lang.InternalError: Remote thread failed for unknown reason
  at sun.tools.attach.WindowsVirtualMachine.enqueue(Native Method)
  at sun.tools.attach.WindowsVirtualMachine.execute(WindowsVirtualMachine.java:96)
  at sun.tools.attach.HotSpotVirtualMachine.executeCommand(HotSpotVirtualMachine.java:261)
  at sun.tools.attach.HotSpotVirtualMachine.executeJCmd(HotSpotVirtualMachine.java:243)
  at sun.tools.attach.HotSpotVirtualMachine.startLocalManagementAgent(HotSpotVirtualMachine.java:204)
  at sun.tools.jconsole.LocalVirtualMachine.loadManagementAgent(LocalVirtualMachine.java:239)
  at sun.tools.jconsole.LocalVirtualMachine.startManagementAgent(LocalVirtualMachine.java:98)
  at sun.tools.jconsole.ProxyClient.tryConnect(ProxyClient.java:333)
  at sun.tools.jconsole.ProxyClient.connect(ProxyClient.java:313)
  at sun.tools.jconsole.VMPanel$2.run(VMPanel.java:294)

解决方法:在运行时加上参数如下

-Dcom.sun.management.jmxremote

查看内存情况

检测死锁

package com.jvm.view;

/**
 * @author: csh
 * @Date: 2020/12/16 17:04
 * @Description:
 */
public class ThradLock {
    /**
     * 线程死锁等待演示
     */
    static class SynAddRunalbe implements Runnable {
        int a, b;
        public SynAddRunalbe(int a, int b) {
            this.a = a;
            this.b = b;
        }
        @Override
        public void run() {
            synchronized (Integer.valueOf(a)) {
                synchronized (Integer.valueOf(b)) {
                    System.out.println(a + b);
                }
            }
        }
    }
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(new SynAddRunalbe(1, 2)).start();
            new Thread(new SynAddRunalbe(2, 1)).start();
        }
    }
}

最后

通过jconsole在windows平台算是一个所见即所得的好工具,不过现在很多开发真的很少用该工具来排查问题,希望本文对java开发同学在工作上有一定的帮助,辅助问题在本地解决。