JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架 ,从Java5.0开始引入到标准Java技术平台中。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。
其实JMX也可以看作一个框架,和我们平时使用的Spring、Hibernate也没有什么区别。只不过他已经附带到了标准java技术平台当中

应用场景:用来对应用程序的运行状态进行监控,比如对一个大型交易处理程序,我们要监控当前有多少交易在排队中,每笔交易的处理时间是多少,平均每处理一笔交易要花多少时间等等。

The JMX technology is native to the Java programming language. As a
result, it offers natural, efficient, and lightweight management
extensions to Java-based functions. It consists of a set of
specifications and development tools for managing Java environments
and developing state-of-the-art management solutions for applications
and services. It provides Java developers with the means to instrument
Java code, create smart Java agents, implement distributed management
middleware and managers, and easily integrate these solutions into
existing management and monitoring systems. The dynamics of the JMX
technology architecture enables you to use it to monitor and manage
resources as they are implemented and installed. It can also be used
to monitor and manage the Java Virtual Machine (JVM machine).

JMX最常见的场景是监控Java程序的基本信息和运行情况,任何Java程序都可以开启JMX,然后使用JConsole或Visual VM进行预览。下图是使用Jconsle通过JMX查看Java程序的运行信息

java监控cpu Java监控框架_jvm


JConsole通过JMX展示的信息都是Java程序的通用信息,如内存情况、线程情况、类加载情况等,换言之,只要是Java程序就都具备这些信息。这些信息为我们优化程序性能、排查BUG非常有用,而JMX就是获取这些信息的基础,因此它是一种非常有用的技术。

然而JMX的强大远不止此,***它出了能提供一些通用的信息以外,还能通过特定的编程接口提供一些针对具体程序的专有信息并在JConsole等JMX客户端工具中展示,具体点说就是程序员可以把需要展示的信息放在一种叫做MBean的Java对象内,然后JConsole之类的客户端工具可以连接到JMX服务,识别MBean并在图形界面中显示。***从纯抽象的角度触发,这其实有点像浏览器发送一个请求给http服务器,然后http服务器执行浏览器的请求并返回相应的数据,从某种角度来说JConsole和JMX也是以这种方式工作的,只是它们使用的协议不是http,交换数据协议格式不是http数据包,但是他们的确是以客户端/服务器这种模式工作的,而且完成的事情也差不多。

下面我们展示JMX是如何完成此任务的。

一、定义一个展示所需信息的MBean接口

public interface ServerInfoMBean {
    int getExecutedSqlCmdCount();
}

在使用 Standard Mbean 作为数据传输对象的情况下这个接口的定义是必须的, 并且接口名称必须以“MBean”这个单词结尾。
二、实现具体的MBean

public class ServerInfo implements ServerInfoMBean {
    public int getExecutedSqlCmdCount() {
        return Dbutil.getExecutedSqlCmdCount();
    }
}

三、在程序的某个地方启动JMX服务并注册ServerInfoMBean

public static void main(String[] args)  throws JMException, Exception{
    MBeanServer server = ManagementFactory.getPlatformMBeanServer();
    ObjectName name = new ObjectName("serverInfoMBean:name=serverInfo");
    server.registerMBean(new ServerInfo(), name);
}

四、运行程序,并通过JConsole查看

java监控cpu Java监控框架_java_02

从下面的架构图可以看到JMX主要分三层,分别是:设备层instrumentation level ,代理层 agent level,管理层 manager level

java监控cpu Java监控框架_java_03


1.设备层


该层包含MBeans和它们的可管理资源。它为实现JMX技术的可管理资源提供了规范,这些资源可以是一个应用程序、服务、设备或用户。如果一个资源是用Java开发的(或提供一个Java包装),并且已经被工具化,从而可以被符合JMX的应用程序管理,那么它就是可管理的。一个资源由一个或多个标准或动态的MBeans工具化。标准MBeans是符合某些设计模式的Java对象(例如,它们必须有一个构造函数和setter/getter方法)。动态MBean符合特定的接口,在运行时提供更多的灵活性。资源的工具化允许它在代理层面上进行管理;但是,请注意,MBeans不需要了解它们所操作的JMX代理。换句话说,任何JMX可管理的资源可以使用任何提供它所需服务的JMX代理。

设备层的关键组件是MBeans、通知模型和MBean元数据类。

MBeans一个MBean是一个实现了特定接口的Java对象。
一个MBean的管理接口被表示为 (1) 可以访问的值属性;(2) 可以调用的操作;(3) 可以发出的通知;以及(4) 构造器。有四种类型的MBeans。
standard MBeans最简单的设计和实现。它们的管理界面由它们的方法名来描述。
dynamic MBeans它们实现了一个特定的接口,并在运行时公开其管理接口,以获得最大的灵活性。
open MBean依靠基本数据类型实现通用管理的动态MBeans;它们是自我描述的,以方便用户使用。
Model MBeans 动态的MBeans,在运行时可以完全配置和自我描述。它们提供了一个具有默认行为的通用MBean类,用于对资源进行动态检测。
通知模型 JMX技术定义了一个基于Java事件模型的通用通知模型。它让开发者建立主动的管理解决方案。使用通知,JMX代理和MBeans可以将关键信息发送给相关方,如管理应用程序或其他MBeans。
MBean元数据类 这些类包含了描述MBean管理界面的所有组件的结构:它的属性、操作、通知和构造器。对于其中的每一个,元数据都包括一个名称、一个描述和它的特定特征(例如,一个属性是可读的、可写的,或者两者都是;对于一个操作,它的参数和返回类型的签名)。

**

2.代理层

**

这一层包含用于暴露MBeans的JMX代理。它提供了实现代理的规范,代理控制资源并使它们对远程管理应用程序可用。代理通常位于它们所管理的资源的同一台机器上,但这并不是一个要求。JMX代理由一个MBean服务器和一组处理MBeans的服务组成。管理者通过协议适配器或连接器访问代理的MBeans并使用提供的服务。但是请注意,JMX代理不需要使用它们的远程管理应用程序的知识。

代理层面的主要组件是MBean服务器和代理服务。

MBean Server一个对象的注册表,这些对象在代理中被暴露于管理操作。任何在MBean服务器上注册的对象对管理应用程序都是可见的。然而,请注意,MBean服务器只公开MBean的管理接口,而不是它的直接对象引用。任何你想从代理的JVM之外管理的资源必须在服务器中注册为一个MBean。服务器还提供了一个标准化的接口,用于访问同一JVM内的MBeans,使本地对象拥有操作可管理资源的所有好处。MBeans可以被另一个MBean、代理本身或通过分布式服务的远程管理应用程序实例化和注册。当你注册一个MBean时,你必须给它分配一个唯一的对象名称,管理应用程序使用该名称来识别要执行管理操作的对象。
Agent Services可以对在MBean服务器中注册的MBeans执行管理操作的对象。通过在代理中包括管理智能,JMX帮助你建立更强大的管理解决方案。
JMX API定义了J2SE 5.0中可用的下列代理服务。
动态类加载器。通过管理小程序(m-let)服务,从任意的网络位置检索并实例化新的类和本地库。
监控器。观察几个MBeans的属性的数字或字符串值,并可以通知其他对象目标中的几种变化类型。
计时器。提供一个基于一次性报警时钟通知或基于重复、定期通知的调度机制。
关系服务。定义MBeans之间的关联,并根据预定义的关系类型来强制执行关系的cardinality。

**

3. 管理(或分布式服务)层

**

该层包含使管理应用程序与JMX代理进行通信的组件。它提供了实现JMX管理器的接口,并定义了对代理进行操作的管理接口和组件。这些组件为管理应用程序提供了一个接口,使其能够通过连接器与代理及其JMX可管理资源进行交互,还通过将JMX代理及其MBeans的语义映射到数据丰富的协议(如HTML)的结构中,公开了JMX代理的管理视图。