JMX(Java 管理拓展)配合Jconsole来使用是用来分析JVM状态的必要途径,开启远程JMX管理有两种方式。
启动参数方式
简化配置项
com.sun.management.jmxremote.ssl=false
com.sun.management.jmxremote.authenticate=false
com.sun.management.jmxremote.port=9989
优化配置项
com.sun.management.jmxremote=true
com.sun.management.jmxremote.authenticate=false
com.sun.management.jmxremote.ssl=false
java.rmi.server.hostname=0.0.0.0
java.net.preferIPv4Stack=true
全量配置项
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=0.0.0.0"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=2028"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.rmi.port=2028"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
oracle的虚拟机会判断,如果你带上了这些参数,那么会在内部调用sun.management.Agent.premain属于Java SE的instrumentation技术.
sun.management.Agent不是jdk通用的类,所以只适用于oracle
主机配置
java.rmi.server.hostname配置项配置主机的IP地址,对于多网卡服务器如果不指定会存在不能正常访问的可能性。
端口配置
com.sun.management.jmxremote.rmi.port=2028这个参数很少有人提及,在本人的(centos7+java8)的环境下,不添加这个jconsole是连接不了的。(原因:JMX is base on RMI, which open two port when it start. )
参考网址
https://blog.csdn.net/surpassno/article/details/60871396
手动编码方式
用来调试JMX源码的时候, 手动编码方式是一个不错的方法,省去了每次配启动参数.
源码展示
package com.honour.test;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
public class MainClasss {
public static void main(String[] args) throws Exception {
StringBuilder param = new StringBuilder();
param.append("com.sun.management.jmxremote.port=9999").append(",");
param.append("com.sun.management.jmxremote.authenticate=false").append(",");
param.append("com.sun.management.jmxremote.ssl=false").append(",");
sun.management.Agent.premain(param.toString());
// MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
// // 等价于 ObjectName("com.haogrgr.test.jmx:key=value")
// ObjectName name = new ObjectName("com.haogrgr.test.jmx", "key", "value");
// HelloServiceImpl hello = new HelloServiceImpl();
//
// mbs.registerMBean(hello, name);
System.err.println("server start !");
Thread.sleep(Integer.MAX_VALUE);
}
}
编译问题
报错信息如下:
- 访问限制:由于对必需的库 C:\soft\java\env\jdk\jdk1.8.0_92\jre\lib\rt.jar 具有一定限制,因此无法访问类型 Agent
- 访问限制:由于对必需的库 C:\soft\java\env\jdk\jdk1.8.0_92\jre\lib\rt.jar 具有一定限制,因此无法访问类型 Agent 中的方法
解决方案如下:
- 右键该项目(如:QQ)----> 构造路径 ----> 配置构造路径 ----> java构造路径 ----> 库 ----> JRE系统库(双击)【点击“JRE系统库”,再点右边的“编辑”按钮】。
- 选择“工作空间缺省JRE”项,点“完成”按钮后,再运行程序,就不会出现错误提示了。
连接示例
双击打开jconsole.exe,在远程进程输入框输入:localhost:9999点击连接即可。
网友评论