Java管理拓展(JMX)
简述
- JMX (Java Management Extensions)是一个为应用程序植入管理功能的框架 ,从Java 1.5开始引入到标准Java技术平台中
- JMX是Java管理系统的一个标准、规范,开发者可以据此定制开发自己的扩展功能
- 除了JDK自身实现了的一些扩展功能,第三方类库或中间件也对此进行扩展,比如spring、quartz-job、commons-pool2、tomcat
- MX主要被用来监测和管理 Java 程序,包括对JVM 内存、CPU 、线程、垃圾收集情况等等。目前市面上的Java监控工具基本都用到了JMX,比如jconsole、jmc、jvisualvm、jprofiler、arthas等
JMX架构
MBean
简述
- MBean(Managed Bean)即被管理的资源,本质上是一个Bean对象。它包含一些属性和方法,用来获取被管理的资源的状态和操纵资源的行为
- JMX 中共有四种类型的 MBean,分别是 Standard MBean, Dynamic MBean, Open MBean, Model MBean
- JDK 提供的 MBean 主要在 java.lang.management 和 javax.management包里面
分类
- Standard MBean
- 这种类型的MBean最简单,它能管理的资源(包括属性,方法,时间)必须定义在接口中,然后MBean必须实现这个接口。
- 它的命名也必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean
- Dynamic MBean
- 必须实现javax.management.DynamicMBean接口,所有的属性,方法都在运行时定义。
- Open MBean和Model MBean都属于Dynamic MBean
- Open MBean
- Open MBean 与其它动态 MBean 的唯一区别在于,前者对其公开接口的参数和返回值有所限制,只能是基本类型或者 javax.management.openmbean包内的 ArrayType、CompositeType、TarbularType 等类型。
- 这主要是考虑到管理系统的分布,很可能远端管理系统甚至 MBServer 层都不具有 MBean 接口中特殊的类
- Model MBean
- 与标准和动态MBean相比,你可以不用写MBean类,只需使用javax.management.modelmbean.RequiredModelMBean 即可。
- RequiredModelMBean实现了ModelMBean接口,而ModelMBean扩展了DynamicMBean接口,因此与DynamicMBean相似,Model MBean的管理资源也是在运行时定义的。
- 与DynamicMBean不同的是,DynamicMBean管理的资源一般定义在DynamicMBean中(运行时才决定管理那些资源),而model MBean管理的资源并不在MBean中,而是在外部(通常是一个类),只有在运行时,才通过set方法将其加入到Model MBean中
常用的MBean介绍
- OperatingSystemMXBean
- 可以获取操作系统相关的信息,机器名称、内存使用、CPU使用等信息。可通过 ManagementFactory.getOperatingSystemMXBean() 方式获取
- RuntimeMXBean
- 可以获取当前 JVM 的信息,包括 JVM 参数和 JVM 相关的系统参数。可以通过 ManagementFactory.getRuntimeMXBean()方式获取
- MemoryMXBean
- 可以获取当前 JVM 的内存使用,包括堆内存和非堆内存。可以通过 ManagementFactory.getMemoryMXBean()获取
- ThreadMXBean
- 获取 JVM 线程使用情况,包括活动线程、守护线程、线程峰值等。可以通过 ManagementFactory.getThreadMXBean() 获取
- ClassLoadingMXBean
- 获取 JVM 类加载情况,包括已加载类、未加载类等。可以通过 ManagementFactory.getClassLoadingMXBean() 获取
- GarbageCollectorMXBean
- 获取 JVM 垃圾收集器的情况,包括使用的哪种垃圾收集器以及回收次数等等。可以通过 ManagementFactory.getGarbageCollectorMXBeans() 获取,注意,这里获取到的是一个集合,因为垃圾收集器分为老年代和新生代两个
自定义MBean
- 实现MBean接口方式
- 实现MXBean接口方式
- 使用Spring Bean方式
MBeanServer
简述
- MBeanServer 是负责管理 MBean 的,一般一个 JVM实例(进程) 只有一个 MBeanServer,所有的 MBean 都要注册到 MBeanServer 上,并通过 MBeanServer 对外提供服务
- 一般用 java.lang.management.ManagementFactory#getPlatformMBeanServer方法获取当前 JVM 内的 MBeanServer
适配器和连接器
简述
- 将写好的 MBean 注册到 MBeanServer 上之后,功能已经具备了。
- 适配器和连接器就是将这些功能开放出来的方式。 比如 HTTP协议适配器,就是将功能以 HTTP 协议开放出去,这样我们就可以在浏览器使用了。
- 但是 JDK 只是提供了适配器的实现标准,并没有具体的实现,比较常用的是 HtmlAdaptorServer,需要 jmxtools.jar 包的支持。
- 连接器是各种客户端最常用的,JDK 提供的默认连接器是 RMI 连接器,JConsole、VisualVM 都是使用它
JMX客户端
简述
- 前面提到使用到JMX的诊断工具有,jconsole、jmc、jvisualvm、jprofiler、arthas,各工具直接实现方式相差比较大,下面对一些常用的诊断工具的实现机制简单的说明下
JMX应用场景
dashboard(仪表盘)监控面板
- 用于监测和管理JVM的常用资源,比如 JVM 内存、CPU 使用率、线程数、垃圾收集情况等等。
- 根据需要可以结合OSHI类库(基于JNA的本机操作系统和硬件信息库)一起使用
- OSHI可以监控磁盘使用率、网络接口、计算机传感器等
动态修改线上日志级别
以logback为例,只需在logback.xml配置文件中,增加<jmxConfigurator />单行配置即可启动JMX支持
查看数据库连接池使用情况
- 使用过alibaba开源的数据库连接池druid都知道,它有着不错的监控页面,可以查看连接池使用情况、SQL执行历史及执行时间统计
查看自定义连接池使用情况
- 例如以jedisPool连接池为例,它使用commons-pools框架实现,并注册到MBean服务器,你完全可以通过MBean浏览器查看redis连接池使用情况
查看quartz-job任务执行情况
通知告警
- 可通过任务轮询的方式定时获取资源状态并进行邮件、短信、钉钉等通知。quartz-job自动任务框架为例,QuartzSchedulerMBeanImpl增加了通知机制,我们可以使用jconsole工具“订阅”通知,也可以自己使用java代码订阅并处理
拓展