当前位置: 首页 > news >正文

JMX 框架

什么是 JMX 框架?

Java Management Extensions (JMX) 是一组用于管理和监控 Java 应用程序、设备、系统资源(如数据库、应用服务器、JVM 等)和服务的 API。JMX 提供了管理和监控应用程序的灵活框架,允许开发人员通过标准的接口和协议监控应用程序的性能、配置和运行状态,或执行管理任务。

核心概念
  1. MBean (Managed Bean): JMX 框架中的核心概念,用于表示可以被管理的资源或对象。MBean 提供了管理对象的接口,这些对象可以暴露操作、属性以及通知。MBean 分为:

    • Standard MBean: 遵循命名约定的普通 Java 类。
    • Dynamic MBean: 提供更灵活的方式来定义属性和操作,而不依赖于编译时。
  2. MBeanServer: MBeanServer 是 JMX 的中央注册点,负责注册和管理 MBean,支持 JMX 客户端的查询和操作。MBeanServer 允许客户端查找并操作已经注册的 MBean。

  3. JMX Agent: 包含 MBeanServer 并允许将 MBeans 暴露给远程或本地的管理应用程序。JMX 代理包括连接器适配器,通过它们,管理应用可以与 JMX 代理进行通信。

  4. JMX 连接器: JMX 连接器提供了通过标准协议(如 RMI、HTTP)与远程 MBean 交互的能力。

  5. 通知机制 (Notification): JMX 允许 MBeans 向注册的侦听器发送通知,侦听器可以对这些事件作出响应。比如,JMX 可以发送内存溢出警告或 CPU 使用率异常等通知。


使用场景

JMX 广泛用于以下场景:

  1. 应用服务器监控和管理: JMX 通常用于监控 Java 应用服务器(如 Apache Tomcat、JBoss、WebLogic),管理员可以通过 JMX 查看服务器状态、线程数、内存使用情况等,并执行配置更改或应用重启等操作。

  2. 性能监控: 在 Java 应用程序中使用 JMX 监控 JVM 的内存使用情况、垃圾回收、线程池、数据源连接池等,确保系统的稳定性和性能。

  3. 实时管理: 可以在运行时动态管理和配置应用程序,比如调整线程池大小、修改数据库连接池配置,或重新加载配置文件等。

  4. 资源使用监控: JMX 可以用于监控系统资源使用,如 CPU 使用率、内存占用情况等,帮助开发人员分析和调优应用。

  5. 故障诊断: 通过 JMX 监控应用程序的日志输出、异常捕获等信息,帮助开发人员发现潜在的性能问题或应用错误。


JMX 结构示例

1. 定义一个 MBean

首先,定义一个 MBean 接口和它的实现类,MBean 暴露了它的属性和操作,以便外部管理系统可以监控和操作。

接口定义 (标准 MBean):

public interface HelloMBean {// Getter 和 Setter 用于暴露属性public String getMessage();public void setMessage(String message);// 暴露的操作public void sayHello();
}

实现类:

public class Hello implements HelloMBean {private String message = "Hello, JMX!";@Overridepublic String getMessage() {return message;}@Overridepublic void setMessage(String message) {this.message = message;}@Overridepublic void sayHello() {System.out.println("Hello from JMX!");}
}
2. 注册 MBean 到 MBeanServer

在主程序中,创建并注册 Hello MBean 到 MBeanServer 进行管理。

import javax.management.*;
import java.lang.management.ManagementFactory;public class Main {public static void main(String[] args) throws Exception {// 获取 MBeanServer 实例MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();// 创建 MBean 对象ObjectName name = new ObjectName("com.example:type=Hello");Hello mbean = new Hello();// 注册 MBeanmbs.registerMBean(mbean, name);// 保持应用程序运行System.out.println("Waiting for incoming requests...");Thread.sleep(Long.MAX_VALUE);}
}
3. 通过 JConsole 监控 MBean

运行该程序后,可以使用 JDK 附带的 JConsole 工具进行监控和管理。启动 JConsole,选择该 Java 进程,找到 com.example:type=Hello MBean,您将看到可以监控和操作的属性和方法:

  • 可以查看和修改 message 属性。
  • 可以执行 sayHello() 方法,输出 “Hello from JMX!”。
4. 使用远程监控

您还可以通过 JMX 连接器进行远程管理。将 JMX 代理暴露为远程连接,允许管理员从远程监控系统获取信息和进行管理操作。

例如,您可以通过 JVM 参数启用远程 JMX 连接:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

然后,远程管理工具可以通过指定的端口连接并管理应用。


实际使用案例

案例 1: 应用服务器管理

在大型企业应用中,JMX 用于管理应用服务器,如 WebLogic、Tomcat。运维人员可以通过 JMX 接口查看服务器的状态,例如当前运行的线程数量、堆内存使用情况、打开的文件句柄数量等。如果发现内存不足,可以通过 JMX 动态调整堆大小,或者重启应用服务器中的某个服务。

案例 2: 数据库连接池监控

在数据库驱动程序或 ORM 框架(如 Hibernate)中,JMX 被用来监控数据库连接池的状态。通过 JMX,开发人员可以查看当前连接池的使用情况(如活跃连接数、空闲连接数),动态调整连接池大小,或在数据库连接泄漏时发出警告。

public interface ConnectionPoolMBean {public int getActiveConnections();public int getIdleConnections();public void resizePool(int size);
}public class ConnectionPool implements ConnectionPoolMBean {private int activeConnections;private int idleConnections;@Overridepublic int getActiveConnections() {return activeConnections;}@Overridepublic int getIdleConnections() {return idleConnections;}@Overridepublic void resizePool(int size) {// 执行调整连接池大小的操作}
}
案例 3: 系统资源监控

JMX 可以用于监控和优化 JVM 运行时的资源利用率,例如监控垃圾收集的频率、CPU 使用率、线程池状态等。通过定期收集这些数据,可以分析系统瓶颈,并在必要时调整 JVM 参数以提高性能。


总结

JMX 是一个强大的 Java 应用管理和监控框架,广泛应用于企业级应用的管理、性能监控和故障诊断等场景。通过 MBean 暴露管理接口,开发人员和运维人员可以在运行时监控应用程序的状态,进行必要的配置更改或操作,提升系统的可维护性和扩展性。

JMX 的使用不仅限于本地管理,还可以通过远程 JMX 代理和连接器进行分布式系统的管理,使得它在现代分布式应用架构中具有广泛的应用价值。

相关文章:

  • Python获取百度翻译的两种方法
  • C语言 | Leetcode C语言题解之第438题找到字符串中所有字母异位词
  • 【小程序】微信小程序课程 -2 快速上手
  • 鸿蒙开发(NEXT/API 12)【硬件(Pen Kit)】手写笔服务
  • HTML中的padding和margin
  • map(lambda x: x[0], sorted(count.items(), key=lambda x: (-x[1], x[0]))[:n])
  • mysql迁移postgreSql windows 工具
  • Redis的数据类型和编码方式
  • 上海电力大学《2020年+2021年830自动控制原理真题》 (完整版)
  • 二维数组的创建和初始化
  • 【高分系列卫星简介——高分辨率多模综合成像卫星】
  • tidb-一场select in百万参数引发的血案
  • 软件测试学习笔记丨curl命令发送请求
  • 前端框架的选择与考量:一场技术的盛宴
  • 电缆缺陷检测系统源码分享
  • Akka系列(七):Actor持久化之Akka persistence
  • iOS | NSProxy
  • Linux后台研发超实用命令总结
  • Median of Two Sorted Arrays
  • pdf文件如何在线转换为jpg图片
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • spring-boot List转Page
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 对超线程几个不同角度的解释
  • 简单数学运算程序(不定期更新)
  • 聚簇索引和非聚簇索引
  • 两列自适应布局方案整理
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 实习面试笔记
  • 微信小程序--------语音识别(前端自己也能玩)
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • Hibernate主键生成策略及选择
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​低代码平台的核心价值与优势
  • ​渐进式Web应用PWA的未来
  • #DBA杂记1
  • #include<初见C语言之指针(5)>
  • #LLM入门|Prompt#3.3_存储_Memory
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $NOIp2018$劝退记
  • (k8s)kubernetes 部署Promehteus学习之路
  • (k8s)Kubernetes本地存储接入
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (三)c52学习之旅-点亮LED灯
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (一)认识微服务
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)创业家杂志:UCWEB天使第一步
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .htaccess配置重写url引擎