JMX的快速入门与使用
文章目录
- 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的快速入门与使用相关推荐
- jmeter压测_简单七步,快速入门 JMeter原生压测
导入本地的 JMeter 原生脚本,即可快速发起一次压测. 前提条件 JMeter 脚本需要在本地调试成功. 请同时上传依赖的 CSV 或者 JAR 文件.CSV 文件的 File Name 只需要文 ...
- 简单七步,快速入门 JMeter原生压测
导入本地的 JMeter 原生脚本,即可快速发起一次压测. 前提条件 JMeter 脚本需要在本地调试成功. 请同时上传依赖的 CSV 或者 JAR 文件.CSV 文件的 File Name 只需要文 ...
- SpringBoot约定大于配置的特性解读 SpringBoot快速入门
SpringBoot约定大于配置 Spring官方网站本身使用Spring框架开发,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置文件以及复杂的Bean依赖关系.随着Spring 3.0的 ...
- 京东必考JVM 问题诊断快速入门
JVM 问题诊断快速入门 JVM 全称为 Java Virtual Machine,翻译为中文 "Java 虚拟机".本文中的JVM主要指 Oracle 公司的 HotSpot V ...
- Apache JMeter压力测试快速入门
引言 前文<Apache JMeter功能测试快速入门>中,我们在bin目录下点击jmeter.bat启动JMeter时,目光如炬的你一定注意到了命令行窗口中的如下提示: Don't us ...
- 监控工具——Metrics 快速入门
Metrics 快速入门 关于Metrics更多的内容可以查看 metrics-getting-started 代码地址 因为每个例子涉及代码较多,且包含测试用例,如果都贴到文章中内容过多,所以只贴出 ...
- Shiro第一个程序:官方快速入门程序Qucickstart详解教程
目录 一.下载解压 二.第一个Shiro程序 1. 导入依赖 2. 配置shiro配置文件 3. Quickstart.java 4. 启动测试 三.shiro.ini分析 四.Quickstart. ...
- 计算机入门新人必学,异世修真人怎么玩?新手快速入门必备技巧
异世修真人怎么快速入门?最近新出来的一款文字修仙游戏,很多萌新不知道怎么玩?进小编给大家带来了游戏新手快速入门技巧攻略,希望可以帮到大家. 新手快速入门攻略 1.开局出来往下找婆婆,交互给点钱,旁边有 ...
- Spring Boot 2 快速教程:WebFlux 快速入门(二)
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...
最新文章
- 国外程序员整理的 C++ 资源大全
- 第九周项目实践3 利用二叉树遍历思想解决问题
- navicat 怎么调试存储过程_Navicat 执行存储过程
- Codeforces Round #374 (Div. 2) A , B , C 水,水,拓扑dp
- java五子棋课程设计_JAVA课程设计(五子棋)021
- 装了Ubuntu后将默认启动项修改为windows
- 8g可用 安装内存16g_同样是16g内存,为啥都选两条8G,不选16G单条,这难道有啥讲究?...
- linux pid t 头文件_linux系统调用相关头文件
- 处理入参_看看优秀的程序员是如何处理NPE的
- scala学习-scala通过mkString方法把一个集合转化为一个字符串
- oracle删除数据库中的所有数据的拼接语句
- 水体专题提取与叶绿素a浓度反演
- 10个妙招 在线视频下载方法大全
- Linux文件误删除恢复操作
- npoi合并取消合并单元格
- win11注册表打不开解决办法,提示被管理员禁用(亲测)(两种方法)
- 七夕表白代码合集,建议收藏!!!
- python的循环控制语句while和for的使用详解
- 仿xp画板、画图重绘、五子棋总结
- 思科认证和华为认证交换机环路的产生原因和解决方法-ielab实验室
热门文章
- android phone恢复出厂设置,Android手机正确恢复出厂设置方法
- 今日头条引流获客方法,流量池捕获精准客源
- valgrind命令
- 物理界炸了!21℃实现室温超导,Nature凌晨刊发撤稿团队新研究,赌城现场被人群挤爆...
- android webview mailto,android – Webview电子邮件链接(mailto)
- Android gdb调试
- linux内核4.9版本,Linux Kernel 4.9.14 LTS和4.4.53 LTS维护版本更新发布
- aws 成本优化_AWS故事或其他任何云成本优化
- 计算机网络总1/10
- 小程序 + Vant