Java管理拓展(JMX)

本文详细介绍了JavaManagementExtensions(JMX)框架,包括其在Java程序管理和监控中的作用,MBean(管理豆)的类型及其在JVM性能监控、操作系统信息获取、自定义MBean和MBeanServer的运用。此外,还探讨了JMX客户端工具如jconsole和QuartzJob的监控功能,以及如何通过JMX实现动态修改日志级别和连接池监控。
摘要由CSDN通过智能技术生成

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代码订阅并处理

拓展

  • MXBean
  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用 Java 的 ProcessBuilder 类来执行 JMeter 的 JMX 脚本。以下是一个示例代码: ``` import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class JMeterRunner { public static void main(String[] args) { String jmeterHome = "C:\\apache-jmeter-5.4.1"; String jmxFile = "C:\\test.jmx"; String jtlFile = "C:\\test.jtl"; String jmeterBin = jmeterHome + "\\bin\\jmeter.bat"; // Build command line arguments List<String> command = new ArrayList<String>(); command.add(jmeterBin); command.add("-n"); command.add("-t"); command.add(jmxFile); command.add("-l"); command.add(jtlFile); // Build process builder ProcessBuilder pb = new ProcessBuilder(command); pb.directory(new File(jmeterHome)); // Start JMeter process try { Process process = pb.start(); // Read JMeter output BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } // Wait for JMeter to finish process.waitFor(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 在这个示例中,jmeterHome 是 JMeter 的安装目录,jmxFile 是要执行的 JMX 脚本的路径,jtlFile 是结果文件的路径。然后创建一个 ProcessBuilder 对象,将 JMeter 的 bin 目录作为工作目录,并传递命令行参数来运行 JMeter。启动 JMeter 进程后,可以读取 JMeter 的输出并等待进程完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z先生09

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值