美文网首页
Jconsole通过JMX访问java应用配置

Jconsole通过JMX访问java应用配置

作者: 明训 | 来源:发表于2021-03-19 01:35 被阅读0次

    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 中的方法 
    

    解决方案如下:

    1. 右键该项目(如:QQ)----> 构造路径 ----> 配置构造路径 ----> java构造路径 ----> 库 ----> JRE系统库(双击)【点击“JRE系统库”,再点右边的“编辑”按钮】。
    2. 选择“工作空间缺省JRE”项,点“完成”按钮后,再运行程序,就不会出现错误提示了。

    连接示例

    双击打开jconsole.exe,在远程进程输入框输入:localhost:9999点击连接即可。

    相关文章

      网友评论

          本文标题:Jconsole通过JMX访问java应用配置

          本文链接:https://www.haomeiwen.com/subject/zwvmcltx.html