前言
通过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
- 源码启动项目
我们通过IDEA启动项目,在下面截图的地方,添加项目的启动参数:
- 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();
}
}
}
总结
欢迎指出我的错误!