Java Management Extensions(JMX)是Java平台中一个重要的管理和监控技术,通过使用JMX,开发人员可以轻松地实现对Java应用程序进行监控和管理。本文将介绍JMX的基本概念、架构及其在Java应用程序中的使用方法。
一、JMX概述
JMX是Java平台的一个标准规范,它定义了一组API和协议,用于管理和监控Java应用程序的运行状态。JMX提供了一种统一的方式来访问Java应用程序的各种资源,包括操作系统、虚拟机、应用程序服务器和自定义应用程序组件等。
JMX的主要功能包括:
- 监控和管理Java应用程序的运行状态:JMX为Java应用程序提供了一种标准化的方式来访问应用程序内部的各种状态信息,比如内存使用情况、线程状态、GC情况等等。这些信息可以用于监控和管理应用程序的性能和可用性。
- 远程访问和管理:JMX支持通过网络远程访问和管理Java应用程序,使得开发人员可以随时随地地监控和管理应用程序的运行状态。
- 自定义MBean:JMX允许开发人员创建自定义MBean(Managed Bean),通过MBean可以暴露应用程序内部的状态信息和操作,从而方便开发人员进行监控和管理。
二、JMX架构
JMX的架构由三个主要组件组成:
- MBean: MBean是Managed Bean的缩写,它是JMX中的核心概念。MBean用于暴露应用程序内部的状态信息和操作,比如内存使用情况、线程状态、GC情况等等。MBean可以被动态地创建、注册和注销,使得开发人员可以非常方便地将应用程序的状态信息暴露给JMX。
- MBean Server: MBean Server是JMX的核心组件,它提供了MBean的注册、查询和调用等功能。MBean Server负责管理所有注册到它上面的MBean,并通过JMX协议向外部提供服务。在Java应用程序中,每个JVM只有一个MBean Server实例。
- JMX Agent: JMX Agent是JMX的客户端组件,它允许开发人员通过网络远程访问和管理MBean Server。JMX Agent可以以独立进程的形式运行,也可以作为Java应用程序的一部分嵌入到应用程序中。
三、JMX使用方法
在Java应用程序中使用JMX需要遵循以下步骤:
- 创建MBean接口:首先需要定义一个MBean接口,该接口用于暴露应用程序内部的状态信息和操作。MBean接口可以使用Java接口或者抽象类来定义,其中每个方法都对应一个MBean的属性或操作。
@MXBean public interface CounterMBean { public int getCounter(); public void setCounter(int counter); public void increase(); public void decrease(); }
- 实现MBean接口:接下来需要编写一个实现MBean接口的类,该类负责实现MBean接口中定义的各种方法,并提供应用程序内部的状态信息和操作。
public class CounterImpl implements CounterMBean { private int counter = 0; @Override public int getCounter() { return counter; } @Override public void setCounter(int counter) { this.counter = counter; } @Override public void increase() { this.counter += 1; } @Override public void decrease() { this.counter -= 1; } }
- MBean 允许通过使用 JMX 代理来管理资源。每个 MBean 都会暴露了底层资源的一部分属性和操作:
可以读写的属性,实现包含属性的 setter 和 getter 方法,在这为 counter。 可以调用的方法,可以向它提供参数或者获取返回值,在这有 increase 和 decrease。
- 创建MBeanServer实例:在Java应用程序中,每个JVM只有一个MBeanServer实例。因此,需要先创建一个MBeanServer实例,并将MBean注册到MBeanServer中。
public class CounterManagement { public static void main(String[] args) throws Exception { // 获取 MBean Server MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer(); // 创建 MBean CounterMBean counter = new CounterImpl(); counter.setCounter(0); // 注册 ObjectName objectName = new ObjectName("com.example.jmx.service.impl:type=CounterImpl, name=MyCounterMBean"); platformMBeanServer.registerMBean(counter, objectName); // 防止退出 while (true) { Thread.sleep(3000); System.out.println("[INFO] 休眠 3s .............."); } } }
ObjectName 由 domain:key 格式构成:
- domain:可以是任意字符串,但根据 MBean 命名约定,一般使用 Java 包名(避免命名冲突)
- key:以逗号分隔的’key=value’键值对列表
我们一般会定义两个 key:
- type=MXBean 接口的实现类的类名,我使用的是
CounterImpl
- name=自定义的名字,这里我使用的是
MyCounterMBean
四、jmx连接
jmx 连接可以通过java程序来获取信息,也可以通过 java 自带的 jconsole 工具来连接,下面我将使用 jconsole 来连接以上运行的程序
选择上面的包名后点击连接
点击 MBean 可以看到类型和 自定义的名称 MyCounterMBean
,属性 Counter 的值为 0,下面有操作,点击 increase 可以增加 1 ,点击 decrease 可以将 counter的 值减一