文章目录

  • JMX应用场景
  • MXBean 和 MBean的区别
  • JMX使用
    • 定义一个MXBean
    • 实现该MXBean
    • 将MXBean注册到JMX中去
    • 使用Jconsole监控
  • JMX官方文档
  • 其他框架用到JMX的示例
  • 源码地址

JMX应用场景

用来监控JVM内各种对象的信息。一个经典场景就是,某一天我们忽然被前方告知,业务大面积瘫痪,这时经过排查,发现由于bug导致数据库连接使用完了没有被释放,导致后续业务没有可用的数据库连接而超时报错。

假如我们使用JMX来监控我们系统中数据库连接池的信息,当数据库连接池出现短时间内连接被大量使用,这个时候可以搭配我们的监控报警系统(如Nagios)在问题未出现之前就进行响应,可以极大避免上述情况的发生

MXBean 和 MBean的区别

JMX中分为MBean和MXBean,这里只给出MXBean的例子,如有兴趣,参考下面官方文档获取有关MBean的内容

二者的区别

一句话简单概括二者的区别:MXBean中可以包含对象,而MBean中只能包含基本类型和String。在jconsole中MXBean中的对象可以正常显示,而MBean中的对象显示不出来

更多有关MBean的实践,可以参考各种开源框架里对JMX的支持。如Log4j2中的LoggerContextAdminMBean、ContextSelectorAdminMBean

JMX使用

使用JMX很简单,基本分为以下几步

定义一个MXBean

@MXBean
public interface MyMXBean{User getUser();String getName();void setName(String name);void logMessage();}

这里有两种写法

  • 直接使用@MXBean注解
  • 不使用注解,但是接口名字必须以MXBean结尾

其他注意事项

  • 在jconsole中显示的名字是Name,也就是getName去掉get前缀,如果是getname,那么在jconsole中显示的名字就是name
  • 在MXBean中可以查看我们自定义的对象,如这里的User.但是在MBean中是观察不到的。原因是MXBean中的User属性包装成了CompositeDataSupport对象
  • jconsole中看到的属性对应的是在MXBean实现类中定义的,对属性的具体操作方法get/set则是在MXBean中定义的,二者通过接口中实现的方法进行关联,如果只有属性而接口中没有和这个属性相关的方法,那么jconsole中是看不到这个属性的
  • jconsole中看到的操作则是不涉及当前类中的属性
  • 【属性】默认的方法名字是get和set和is*去掉前缀。如果提供了set和get方法,那么该属性在jconsole中的属性【那里】是可以直接编辑,然后【刷新】的
    一个简单的方法是,如果属性点开右边显示部分是蓝色,那么基本可以是编辑的。也说明这个属性有setA和getA方法。如果是灰色的,说明不可编辑。只有getA方法
  • 【操作】如果方法名字不是上述的那几种,则为操作。也可以是同为set*方法,但是有多个参数。参考org.apache.logging.log4j.core.jmx.LoggerContextAdminMBean#setConfigText

实现该MXBean

public class MyMXBeanImpl implements MyMXBean {private String name = "jack";private User user = User.builder().name("jack").password(888888L).used(false).build();;@Overridepublic User getUser() {return user;}@Overridepublic String getName() {return name;}@Overridepublic void setName(String name) {this.name = name;}/*** JMX 操作示例*/@Overridepublic void logMessage() {log.info("log message");}
}

将MXBean注册到JMX中去

@Component
public class JMXRegister {@PostConstruct@SneakyThrowspublic void registerMXBeans() {MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();ObjectName mxbeanName = new ObjectName("com.demo.jmx.mbean:type=MyMXBeanImpl, name=custom");MyMXBeanImpl myMXBean = new MyMXBeanImpl();mbs.registerMBean(myMXBean, mxbeanName);}
}

可以看到这里很简单,就是new了一个我们需要监控的Bean,然后给它一个名字。其中ObjectName的写法为

xxx:type=MXBean接口的实现类的类名, name=自定义的名字

使用Jconsole监控

启动应用之后,启动Jconsole,启动之后找到我们应用的进程名字,点击连接。连接进去之后在MBean那里即可找到刚才自定义的MXBean
可以看到属性和操作

在属性值CompositeDataSupport上双击可以看到对象内部的属性,再次双击则隐藏



在具体属性下面,可以进行查看和修改具体属性的具体值

注意 : 具体属性的值能不能修改取决去属性是由什么修饰,如果是由final修饰,那肯定是修改不了的

这里可以看到我们的MXBean在JMX中,它的ObjectName到底是什么。这一点很有用,当我们想要监控一个第三方类库中的MXBean,但是不知道它在JMX中叫什么时,可以在本地启动代码,然后在Jconsole中找到它

如果想要连接远程JMX,则可以使用类似以下这种写法

service:jmx:rmi://192.168.30.10:1234/jndi/rmi://192.168.30.10:2344/jmxrmi
service:jmx:rmi://<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT>/jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi

这样一看就清晰多了吧。如果还不理解,可以看Stackoverflow关于JMX的url的解释

JMX官方文档

  • 官方文档
  • 官方文档2

其他框架用到JMX的示例

JMX使用的身影可以在很多地方都可以找到,这里列举两个

  • SpringBoot中用到的SpringApplicationAdminMXBean
  • Java内部的MemoryMXBean

源码地址

  • Github仓库

JMX的快速入门与使用相关推荐

  1. jmeter压测_简单七步,快速入门 JMeter原生压测

    导入本地的 JMeter 原生脚本,即可快速发起一次压测. 前提条件 JMeter 脚本需要在本地调试成功. 请同时上传依赖的 CSV 或者 JAR 文件.CSV 文件的 File Name 只需要文 ...

  2. 简单七步,快速入门 JMeter原生压测

    导入本地的 JMeter 原生脚本,即可快速发起一次压测. 前提条件 JMeter 脚本需要在本地调试成功. 请同时上传依赖的 CSV 或者 JAR 文件.CSV 文件的 File Name 只需要文 ...

  3. SpringBoot约定大于配置的特性解读 SpringBoot快速入门

    SpringBoot约定大于配置 Spring官方网站本身使用Spring框架开发,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置文件以及复杂的Bean依赖关系.随着Spring 3.0的 ...

  4. 京东必考JVM 问题诊断快速入门

    JVM 问题诊断快速入门 JVM 全称为 Java Virtual Machine,翻译为中文 "Java 虚拟机".本文中的JVM主要指 Oracle 公司的 HotSpot V ...

  5. Apache JMeter压力测试快速入门

    引言 前文<Apache JMeter功能测试快速入门>中,我们在bin目录下点击jmeter.bat启动JMeter时,目光如炬的你一定注意到了命令行窗口中的如下提示: Don't us ...

  6. 监控工具——Metrics 快速入门

    Metrics 快速入门 关于Metrics更多的内容可以查看 metrics-getting-started 代码地址 因为每个例子涉及代码较多,且包含测试用例,如果都贴到文章中内容过多,所以只贴出 ...

  7. Shiro第一个程序:官方快速入门程序Qucickstart详解教程

    目录 一.下载解压 二.第一个Shiro程序 1. 导入依赖 2. 配置shiro配置文件 3. Quickstart.java 4. 启动测试 三.shiro.ini分析 四.Quickstart. ...

  8. 计算机入门新人必学,异世修真人怎么玩?新手快速入门必备技巧

    异世修真人怎么快速入门?最近新出来的一款文字修仙游戏,很多萌新不知道怎么玩?进小编给大家带来了游戏新手快速入门技巧攻略,希望可以帮到大家. 新手快速入门攻略 1.开局出来往下找婆婆,交互给点钱,旁边有 ...

  9. Spring Boot 2 快速教程:WebFlux 快速入门(二)

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...

最新文章

  1. 国外程序员整理的 C++ 资源大全
  2. 第九周项目实践3 利用二叉树遍历思想解决问题
  3. navicat 怎么调试存储过程_Navicat 执行存储过程
  4. Codeforces Round #374 (Div. 2) A , B , C 水,水,拓扑dp
  5. java五子棋课程设计_JAVA课程设计(五子棋)021
  6. 装了Ubuntu后将默认启动项修改为windows
  7. 8g可用 安装内存16g_同样是16g内存,为啥都选两条8G,不选16G单条,这难道有啥讲究?...
  8. linux pid t 头文件_linux系统调用相关头文件
  9. 处理入参_看看优秀的程序员是如何处理NPE的
  10. scala学习-scala通过mkString方法把一个集合转化为一个字符串
  11. oracle删除数据库中的所有数据的拼接语句
  12. 水体专题提取与叶绿素a浓度反演
  13. 10个妙招 在线视频下载方法大全
  14. Linux文件误删除恢复操作
  15. npoi合并取消合并单元格
  16. win11注册表打不开解决办法,提示被管理员禁用(亲测)(两种方法)
  17. 七夕表白代码合集,建议收藏!!!
  18. python的循环控制语句while和for的使用详解
  19. 仿xp画板、画图重绘、五子棋总结
  20. 思科认证和华为认证交换机环路的产生原因和解决方法-ielab实验室

热门文章

  1. android phone恢复出厂设置,Android手机正确恢复出厂设置方法
  2. 今日头条引流获客方法,流量池捕获精准客源
  3. valgrind命令
  4. 物理界炸了!21℃实现室温超导,Nature凌晨刊发撤稿团队新研究,赌城现场被人群挤爆...
  5. android webview mailto,android – Webview电子邮件链接(mailto)
  6. Android gdb调试
  7. linux内核4.9版本,Linux Kernel 4.9.14 LTS和4.4.53 LTS维护版本更新发布
  8. aws 成本优化_AWS故事或其他任何云成本优化
  9. 计算机网络总1/10
  10. 小程序 + Vant