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(); } } }
总结
欢迎指出我的错误!
下一篇:
Java如何优雅的调用外部Api