冷知识:JMX、Java Virtual Machine Tool Interface (JVMTI)

APM 系统用到的一些底层技术如 JMX、JVM TI、字节码技术等

JMX

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。

结合jconsole和JMX访问我们对象内部信息

java程序启动后,我们可以通过程序提供的接口访问程序内部的数据,除了这种方式外我们还有其他方式吗?答案是:有的
我们可以扩展java提供的JMX框架,自定义一些列的MBean(management bean),然后通过设计这个bean里的方法(即向外界提供的接口)框架会将这些方法暴露出去;

代码示例
  • 定义一个 DemoMBean 接口,注意这里的类名必须是 MBean结尾
package com.xx;
public interface DemoMBean {

    String getInfo();

    String setAndReturnInfo(String info);
}

  • 再定义一个实现类 Demo,注意实现类与接口的命名规则:实现类名 + MBean = 接口类名,并且这个类要和它的接口在相同包下面
package com.xx;
public class Demo implements DemoMBean {

    private String info;

    @Override
    public String getInfo() {
        System.out.println("有人获取的信息");
        return info;
    }

    @Override
    public String setAndReturnInfo(String info) {
        this.info = info;
        System.out.println("有人刷新了信息:" + info);
        return info;
    }
}

  • 一个启动类
package com.xx;

import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;

/**
 * JMX的使用步骤
 * 1. 定义接口与资源实体类,接口中定义属性与操作;get表示可读,set表示可写。
 * 2. 创建Agent类。
 * a. 创建MBeanServer,相当于管理MBean的容器,创建方式有两种一获取JVM中默认启动的Mbean server 或者 自己创建。
 * b. 创建ObjectName,用于标识唯一的资源MBean,格式为:"域名:name=MBean名称"。
 * c. 绑定MBean与对应的ObjectName并注册到MBeanServer。
 * 至此即可通过JConsole管理本地的MBean的先关信息了,同事也可以提供其他的连接方式,如:
 * 3. rmi连接方式。
 * a. 注册监听端口号。
 * b. 创建JMXServiceURL,格式为:service:jmx:rmi://localhost:0/jndi/rmi://localhost:1099/jmxrmi(完整版)  JMXServiceURL格式说明 。
 * c. 创建jmxConnectorServer,绑定MBserver与Url。
 * 4. HtmlAdaptor连接管理方式(需要引入jmxtools.jar)。
 * a. 创建Html适配器,并设置监听端口。
 * b. 创建适配器ObjectName,绑定Html适配器并注册到MBeanServer。
 * c. 开启适配器。
 */
public class Main {
    public static void main(String[] args) throws Exception {
        // 获得 MBeanServer
        MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();

        // 创建ObjectName
        ObjectName objectName = new ObjectName("com.xx:name=Demo");

        // 创建具体逻辑处理MBean
        Demo demo = new Demo();

        // 绑定MBean与对应的ObjectName并注册到MBeanServer
        platformMBeanServer.registerMBean(demo, objectName);

        Thread.sleep(Integer.MAX_VALUE);
    }
}

然后启动该程序

打开jconsole

1、命令行输入 jconsole,在本地进程中可以看到我们启动的程序
在这里插入图片描述
2、点击“不安全的连接”
在这里插入图片描述
3、点击连接后,我们点击MBean 标签
在这里插入图片描述
椭圆的地方就是我们注册的管理类名字,下面树形结构列出了我们自定义MBean类里的属性和方法

4、执行MBean里的方法
在这里插入图片描述
控制台可以看到有打印
在这里插入图片描述
代码已经上传到这里 下载 https://gitee.com/aqu415/demo/tree/master/mBeanDemo

开启远程JMX支持

假如Java程序并非运行在本地而是运行在远端服务器上我们应该如何通过客户端去连接呢, 可以在启动脚本里加上参数:

-Djava.rmi.server.hostname=127.0.0.1
-Dcom.sun.management.jmxremote.port=10086
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

Java Virtual Machine Tool Interface

参考 【官网文档】

Java Virtual Machine Tool Interface 常见的技术产物就是我们见到的javaagent

javaagent开发极简入门参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值