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