艾瑞
艾瑞
新闻资讯
中心动态 学习技巧
自从学会 JMX 监控和管理 Java 程序,睡得真香!
2021-12-13

自从学会 JMX 监控和管理 Java 程序,睡得真香!(图1)

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 的具体优点:

  1. 开箱即用的监控功能,JMX 是 Java SE 的标准部分,提供了资源管理、服务托管、远程监控等管理基础功能,都可以直接启用。
  2. JMX 技术提供了一种通用的、标准的资源、系统、应用程序、网络的管理方式,不仅可以本地使用、远程使用;还可以扩展到其他场景,如 Java EE 应用等。
  3. JMX 技术提供了对 JVM 状态的监测功能,JMX 已经内置了对 JVM 的监测功能,并且可以监控和管理 JVM,十分方便。
  4. JMX 架构设计优秀,组件化的设计可以自由的扩展。
  5. JMX 技术严格遵守 Java 现有规范如 JNDI 规范。
  6. JMX 可以自由的与其他管理解决方案集成,得益于开放的 JMX API,可以通过 web 服务管理 JMX 中的资源。

3. JMX 的技术架构

JMX 技术架构主要有资源管理(MBean/MXBean)模块,资源代理模块(MBean Server),远程管理模块(Remote API)组成 ,下面的图片来自维基百科,很好的展示了三个模块之间的关系。

自从学会 JMX 监控和管理 Java 程序,睡得真香!(图2)

3.1. 资源管理 MBean

资源管理在架构中标识为资源探测层(Probe Level),在 JMX 中, 使用 MBean 或 MXBean 来表示一个资源(下面简称 MBean),访问和管理资源也都是通过 MBean,所以 MBean 往往包含着资源的属性和操作方法

JMX 已经对 JVM 进行了多维度资源检测,所以可以轻松启动 JMX 代理来访问内置的 JVM 资源检测,从而通过 JMX 技术远程监控和管理 JVM。

下面列举 JMX 对 JVM 的资源检测类,都可以直接使用。

自从学会 JMX 监控和管理 Java 程序,睡得真香!(图3)


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 在网页端进行管理。

4. JMX 的具体使用

在资源管理 MBean 部分已经演示了使用 JMX 获取 JVM 运行信息,那么如果想要自定义一个资源 MBean 呢?

下面通过一个例子,模拟一个内存资源 MBean,最后对它进行远程管理。

4.1. 编写资源管理 MBean

MBean 的编写必须遵守 JMX 的设计规范,MBean 很像一个特殊的 Java Bean,它需要一个接口和一个实现类。MBean 资源接口总是以 MBean 或者 MXBean 结尾实现类则要以接口去掉 MBean 或 MXBean 之后的名字来命名

4.2. 注册资源到 MBean Server

通过上面的 JMX 架构图,我们知道 MBean 资源需要注册到 MBean Server 进行代理才可以暴露给外部进行调用,所以我们想要通过远程管理我们自定义的 MyMemory 资源,需要先进行资源代理。

4.3. 远程管理 jconsole

jconsole 是 Java 自带的基于 JMX 技术的监控管理工具,如果已经配置了 JDK 环境变量,可以直接控制台通过 jconsole 命令启动。

自从学会 JMX 监控和管理 Java 程序,睡得真香!(图4)

远程管理 jconsole


启动 jconsole 后会列出当前机器上的 Java 进行,这里选择自己要监控的 Java 进程进行监控,连接后会提示不安全的协议,是因为 Java 程序默认启动是不会配置 HTTPS 协议的原因。

连接后可以看到多维度的 JVM 监控信息,这些信息都是通过读取 JVM 资源 MBean 信息得到的。

1-211213092259449.jpg

JVM 监控信息


在下面这个页面列举了线程信息,注意最下面的线程信息,可以看到 RMI TCP 线程,这里也证明了 JMX 默认通过 RMI 协议进行远程管理。


1-21121309233A46.jpg

线程信息


在 MBean 页面可以浏览所有可管理的 MBean 信息,也可以看到我们自定义的 com.wdbyte.jmx 中的内存信息,甚至可以直接修改其中的 used 变量。


1-2112130924154O.jpg

浏览所有可管理的 MBean 信


在操作中可以调用 doMemoryInfo 方法,调用后可以看到返回值中使用内存已经由启动时的 20MB 更新为 30MB。


1-211213092459562.jpg