JConsole远程连接 与 JMX远程连接


前言

通过JConsole,我们可以查看JVM的内存等使用情况,也可以查看MBean信息,我们一般是源码运行项目,然后直接用JConsole访问本地的java程序,这种情况是不需要做任何改动的,可以直接连接本地java程序。

但是如果想JConsole远程连接,就需要添加启动参数,开启远程访问。


一、开启远程连接条件

JConsole实际上就是通过JMX去连接一个运行中的java程序,获取里面的信息

而JMX想要远程访问是需要启动一个JMX的连接端口,所以我们需要在启动java应用的时候,指定一些参数

-Djava.rmi.server.hostname=172.16.205.66
-Dcom.sun.management.jmxremote.port=1088
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
    源码启动项目
    linux下命令启动项目

运行命令

java -jar -Djava.rmi.server.hostname=172.16.205.66 -Dcom.sun.management.jmxremote.port=1088 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false product.jar

二、JConsole连接

打开JConsole,选择远程连接,输入 ip:端口

ip:是上面启动参数中指定的ip,就是应用运行环境的实际ip 端口:是上面启动参数中指定的jmx端口,这个是jmx的连接端口

三、JMX代码连接

上面我们通过JConsole远程连接java应用,上面也说了JCosole实际上是通过JMX实现的

下面我们直接用一段代码,去手动实现JMX连接java应用

public class TestJMX {
          
   

    public static void main(String[] args) {
          
   
        String ip = "172.16.205.66";
        String jmxPort = "1088";
        String jmxURL = "service:jmx:rmi:///jndi/rmi:/" + ip + "/:" + jmxPort + "/jmxrmi";
        try {
          
   
            JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
            Map<String, Object> map = new HashMap<String, Object>();
            //账号密码,之前没有开启权限,这里传个空数组就好,按实际填
            // String[] credentials = new String[] { "monitorRole", "QED" };
            String[] credentials = new String[] {
          
   };
            map.put("jmx.remote.credentials", credentials);
            JMXConnector connect = JMXConnectorFactory.connect(serviceURL, map);
            MBeanServerConnection mbsc = connect.getMBeanServerConnection();
            MemoryMXBean memoryMXBean = ManagementFactory.newPlatformMXBeanProxy(mbsc, ManagementFactory.MEMORY_MXBEAN_NAME, MemoryMXBean.class);
            RuntimeMXBean runtimeMXBean = ManagementFactory.newPlatformMXBeanProxy(mbsc, ManagementFactory.RUNTIME_MXBEAN_NAME, RuntimeMXBean.class);
            ThreadMXBean threadMXBean = ManagementFactory.newPlatformMXBeanProxy(mbsc, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class);
            java.lang.management.OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.newPlatformMXBeanProxy(mbsc, ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class);
            ConnectorMBean ConnectorMBean = ManagementFactory.newPlatformMXBeanProxy(mbsc, "Winas:type=Connector,port=8088", ConnectorMBean.class);
            String jvmName = runtimeMXBean.getName();
            System.out.println("pid:" + jvmName.split("@")[0]);
            connect.close();
        } catch (Exception e) {
          
   
            e.getStackTrace();
        }
    }

}

总结

欢迎指出我的错误!

经验分享 程序员 微信小程序 职场和发展