此篇文章介绍 Java JMX 技术的相关概念和具体的使用方式。
当前文章属于Java 性能分析优化系列文章,点击话题可以查看所有文章。
1. JMX 是什么?
Java Management Extensions(JMX)技术是 Java SE 平台的标准功能,提供了一种简单的、标准的监控和管理资源的方式,对于如何定义一个资源给出了明确的结构和设计模式,主要用于监控和管理 Java 应用程序运行状态、设备和资源信息、Java 虚拟机运行情况等信息。JMX 是可以动态的,所以也可以在资源创建、安装、实现时进行动态监控和管理,JDK 自带的 jconsole 就是使用 JMX 技术实现的监控工具。
使用 JMX 技术时,通过定义一个被称为 MBean 或 MXBean 的 Java 对象来表示要管理指定的资源,然后可以把资源信息注册到 MBean Server 对外提供服务。MBean Server 充当了对外提供服务和对内管理 MBean 资源的代理功能,如此优雅的设计让 MBean 资源管理和 MBean Server 代理完全独立开,使之可以自由的控制 MBean 资源信息。
JMX 不仅仅用于本地管理,JMX Remote API 为 JMX 添加了远程功能,使之可以通过网络远程监视和管理应用程序。
2. 为什么使用 JMX 技术?
JMX 技术为 Java 开发者提供了一种简单、灵活、标准的方式来监测 Java 应用程序,得益于相对独立的架构设计,使 JMX 可以平滑的集成到各种监控系统之中。
下面列举几项 JMX 的具体优点:
- 开箱即用的监控功能,JMX 是 Java SE 的标准部分,提供了资源管理、服务托管、远程监控等管理基础功能,都可以直接启用。
- JMX 技术提供了一种通用的、标准的资源、系统、应用程序、网络的管理方式,不仅可以本地使用、远程使用;还可以扩展到其他场景,如 Java EE 应用等。
- JMX 技术提供了对 JVM 状态的监测功能,JMX 已经内置了对 JVM 的监测功能,并且可以监控和管理 JVM,十分方便。
- JMX 架构设计优秀,组件化的设计可以自由的扩展。
- JMX 技术严格遵守 Java 现有规范如 JNDI 规范。
- JMX 可以自由的与其他管理解决方案集成,得益于开放的 JMX API,可以通过 web 服务管理 JMX 中的资源。
3. JMX 的技术架构
JMX 技术架构主要有资源管理(MBean/MXBean)模块,资源代理模块(MBean Server),远程管理模块(Remote API)组成 ,下面的图片来自维基百科,很好的展示了三个模块之间的关系。
图片来自维基百科
3.1. 资源管理 MBean
资源管理在架构中标识为资源探测层(Probe Level),在 JMX 中, 使用 MBean 或 MXBean 来表示一个资源(下面简称 MBean),访问和管理资源也都是通过 MBean,所以 MBean 往往包含着资源的属性和操作方法。
JMX 已经对 JVM 进行了多维度资源检测,所以可以轻松启动 JMX 代理来访问内置的 JVM 资源检测,从而通过 JMX 技术远程监控和管理 JVM。
下面列举 JMX 对 JVM 的资源检测类,都可以直接使用。
资源接口 | 管理的资源 | Object Name | VM 中的实例个数 |
ClassLoadingMXBean | 类加载 | java.lang:type= ClassLoading | 1个 |
CompilationMXBean | 汇编系统 | java.lang:type= Compilation | 0 个或1个 |
GarbageCollectorMXBean | 垃圾收集 | java.lang:type= GarbageCollector, name=collectorName | 1个或更多 |
LoggingMXBean | 日志系统 | java.util.logging:type =Logging | 1个 |
MemoryManagerMXBean | 内存池 | java.lang: typeMemoryManager, name=managerName | 1个或更多 |
MemoryPoolMXBean | 内存 | java.lang: type= MemoryPool, name=poolName | 1个或更多 |
MemoryMXBean | 内存系统 | java.lang:type= Memory | 1个 |
OperatingSystemMXBean | 操作系统 | java.lang:type= OperatingSystem | 1个 |
RuntimeMXBean | 运行时系统 | java.lang:type= Runtime | 1个 |
ThreadMXBean | 线程系统 | java.lang:type= Threading | 1个 |
下面的代码示例演示了使用 JMX 检测 JVM 某些信息的代码示例。
package com.wdbyte.jmx; import java.lang.management.CompilationMXBean; import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryManagerMXBean; import java.lang.management.MemoryUsage; import java.lang.management.OperatingSystemMXBean; import java.util.List; import java.util.stream.Collectors; /** * JMX JVM * * @author https://www.wdbyte.com */ public class JavaManagementExtensions { public static void main(String[] args) { OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean(); String osName = operatingSystemMXBean.getName(); String osVersion = operatingSystemMXBean.getVersion(); int processors = operatingSystemMXBean.getAvailableProcessors(); System.out.println(String.format("操作系统:%s,版本:%s,处理器:%d 个", osName, osVersion, processors)); CompilationMXBean compilationMXBean = ManagementFactory.getCompilationMXBean(); String compilationMXBeanName = compilationMXBean.getName(); System.out.println("编译系统:" + compilationMXBeanName); MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage(); long max = heapMemoryUsage.getMax(); long used = heapMemoryUsage.getUsed(); System.out.println(String.format("使用内存:%dMB/%dMB", used / 1024 / 1024, max / 1024 / 1024)); List<GarbageCollectorMXBean> gcMXBeans = ManagementFactory.getGarbageCollectorMXBeans(); String gcNames = gcMXBeans.stream() .map(MemoryManagerMXBean::getName) .collect(Collectors.joining(",")); System.out.println("垃圾收集器:" + gcNames); } }
运行可以得到如下结果:
操作系统:Mac OS X,版本:11.6,处理器:12 个 编译系统:HotSpot 64-Bit Tiered Compilers 使用内存:3MB/4096MB 垃圾收集器:G1 Young Generation,G1 Old Generation
3.2. 资源代理 MBean Server
资源代理 MBean Server 是 MBean 资源的代理,通过 MBean Server 可以让 MBean 资源用于远程管理, MBean 资源和 MBean Server 往往都是在同一个 JVM 中,但这不是必须的。
想要 MBean Server 可以管理 MBean 资源,首先要把资源注册到 MBean Server,任何符合 JMX 的 MBean 资源都可以进行注册,最后 MBean Server 会暴露一个远程通信接口对外提供服务。
3.3. JMX 远程管理
可以通过网络协议访问 JMX API,如 HTTP 协议、SNMP(网络管理协议)协议、RMI 远程调用协议等,JMX 技术默认实现了 RMI 远程调用协议。
受益于资源管理 MBean 的充分解耦,可以轻松的把资源管理功能扩展到其他协议,如通过 HTTP 在网页端进行管理。