JMX

JMX(Java Management Extensions)是一个应用程序植入管理功能的框架,是一套标准的代理和服务,服务是JDK官方提供的Java程序性能监控程序。支持远程访问,支持扩展,即自定义监控的性能参数。提供网络、API、客户端三个层次的调用。实际上,Java平台使用JMX作为管理和监控的标准接口,任何程序只要按JMX规范访问这个接口,就可以获取所有的管理和监控信息。常用的运维监控如Zabbix、Nagios等工具对JVM本身的监控都是通过JMX获取的信息。

应用场景

中间件软件WebLogic的管理页面就是基于JMX开发的,而JBoss则是整个系统都基于JMX架构,对于一些参数的修改,有几种方式如下:

  1. 写死在代码里,需要改动的时候去修改,然后重新编译发布。

  2. 写在配置文件里,例如java的properties,需要改变时,只需要修改配置文件,但必须重启系统才能生效。

  3. 写一段代码,把配置值缓存起来,系统在获取的时候,先看看配置文件改动没,如有改动,则从配置里获取最新值,否则从缓存里读取,例如读取Apollo配置中心数据。

  4. 用JMX把需要配置的属性集中在一个类里,然后写一个MBean,再进行相关配置,并且JMX提供了JConsole工具页,方便对参数值进行修改。

JMX架构

  ┌─────────┐  ┌─────────┐│jconsole │  │   Web   │└─────────┘  └─────────┘│            │
┌ ─ ─ ─ ─│─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─JVM     ▼            ▼        │
│   ┌─────────┐  ┌─────────┐┌─┤Connector├──┤ Adaptor ├─┐ │
│ │ └─────────┘  └─────────┘ ││       MBeanServer        │ │
│ │ ┌──────┐┌──────┐┌──────┐ │└─┤MBean1├┤MBean2├┤MBean3├─┘ │
│   └──────┘└──────┘└──────┘─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘

JMX的结构一共分为三层:基础层(主要是MBean)、适配层(Adaptor)、接口层(Connector)

MBean

JMX把所有被管理的资源都成为MBean(ManagedBean),这些MBean全部由MBeanServer管理,如果要访问MBean,可以通过MBeanServer对外提供的访问接口,例如RMI或HTTP。

使用JMX不需要安装任何额外组件,也不需要第三方库,因为MBeanServer已经内置在JavaSErver标准库中,JavaSE还提供了一个JConsole程序,用于RMI连接MBeanServer,这样就可以管理整个进程。

除了JVM会把自身的各种资源以MBean注册到JMX中,我们自己的配置、监控信息也可以作为MBean注册到JMX,这样,管理程序就可以直接控制我们暴露的MBean。

MBean分为如下四种:

类型 描述
standard MBean 这种类型的MBean最简单,它能管理的资源(包括属性,方法,时间)必须定义在接口中,然后MBean必须实现这个接口。它的命名也必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean。
dynamic MBean 必须实现javax.management.DynamicMBean接口,所有的属性,方法都在运行时定义
open MBean 此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中。后面的例子会有详细介绍

适配层

MBeanServer 主要是提供对资源你的注册和管理

接入层

提供远程访问入口

使用方法

  1. 编写MBean提供的管理接口和监控数据。
  2. 注册MBean

案例:

在启动程序添加注解@EnableMBeanExport,告知spring自动注册MBean

@SpringBootApplication
@MapperScan(basePackages = "com.lyj.demo.mapper")
@EnableMBeanExport // 自动注册MBean
public class SpringbootDemoApplication {private static final Logger logger = LoggerFactory.getLogger(SpringbootDemoApplication.class);public static void main(String[] args) {SpringApplication.run(SpringbootDemoApplication.class, args);}}

编写MBean,这里以配置黑名单数据为例,通过JConsole来获取配置数据和添加数据删除数据,并且配置后立即生效不需要重新编译和发布代码。

package com.lyj.demo.mbean;import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedOperationParameter;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.stereotype.Component;import java.util.HashSet;
import java.util.Set;/*** @author 凌兮* @date 2021/3/25 14:05* 黑名单MBean类名必须以MBean结尾,这是规则*/
@Component
// 表示这是一个MBean,将要被注册到JMX,objectName指定了这个MBean的名字,通常以company:name=Xxx(公司名);来分类MBean
@ManagedResource(objectName = "company:name = blackList", description = "blackList of Ip address")
public class BlackListMBean {private static Set<String> ips = new HashSet<>();static {ips.add("123");ips.add("234");}/*** 对于属性,使用@ManagedAttribute注解标注,本次的MBean只有get属性,没有set* 属性,说明这是一个只读属性。* @return*/@ManagedAttribute(description = "Get IP addresses in blacklist")public String[] getBlacklist() {return ips.toArray(new String[1]);}/*** 对于操作,使用@ManagedOperation注解标注,操作有addBlacklist()和* removeBlacklist()其他方法如shouldBlock()不会被暴露给JMX。* @param ip*/@ManagedOperation@ManagedOperationParameter(name = "ip", description = "Target IP address that will be added to blacklist")public void addBlacklist(String ip) {ips.add(ip);}@ManagedOperation@ManagedOperationParameter(name = "ip", description = "Target IP address that will be removed from blacklist")public void removeBlacklist(String ip) {ips.remove(ip);}public boolean shouldBlock(String ip) {return ips.contains(ip);}
}

拦截接口和实现类:

public interface IpInterceptor {boolean preHandle(String ip);
}
@Component
@Slf4j
public class BlackIpHandle implements IpInterceptor {@Autowiredprivate BlackListMBean blackListMBean;@Overridepublic boolean preHandle(String ip) {return blackListMBean.shouldBlock(ip);}
}

测试方法:

@RequestMapping("/test/Jmx/{str}")
public void jmxTest(@PathVariable(value = "str") String str) {if (blackIpHandle.preHandle(str)) {loggger.warn("拦截成功");return;}loggger.warn("拦截失败");return;
}

启动应用程序,打开java里的jdk文件里的bin文件的里JConsole.exe,找到你的应用程序,连接进去,

在JConsole里可以查看内存和堆栈线程等信息,这里可以看到MBean列表,里面可以找到我们的注册的Mean(company)
,里面有属性,操作,通知等,
首先我们执行获取黑名单数据方法结果:
可以看到三个数据,添加数据也是一样,6666是我后来动态通过JConsole添加的,然后执行请求,直接拦截成功。这里我们直接测试的结果如图所示:

Java程序开启JMX服务

想监控Java程序,需要在程序启动时加上JMX相关参数(本地连接,这里加不加都可以,这里的端口号是JConsole监听的端口号,不是服务的端口号)。

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

三个参数分别为:服务端口,安全策略,SSL加密

远程连接

测试环境部署在RedHat6.5服务器上,一般说明增加如下参数即可允许远程连接。

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

但是实际测试无法连接,经过查询资料,最后配置如下,实现了远程连接。

(java -jar -Dcom.sun.management.jmxremote  -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.rmi.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false app-1.0.jar&)

同时还需要注意服务器的端口是否被屏蔽,hosts是否配置了实际IP。可以使用hostname -i命令来查询ip是否生效。例如实际ip是10.10.10.101,计算机名是mycomputer。hosts配置如下:

10.10.10.101   mycomputer

JMX详解及JConsole使用相关推荐

  1. JMX详解以及使用示例

    目录 目录 JMX是什么 JMX架构 MBean 标准MBean 定义接口 实现接口 注册MBean 使用MBean 如何通过Web管理MBean 开放类型MBean 自定义参数 MXBean接口定义 ...

  2. 4大JVM性能分析工具详解,及内存泄漏分析方案

    谈到性能优化分析一般会涉及到: Java代码层面的,典型的循环嵌套等 还会涉及到Java JVM:内存泄漏溢出等 MySQL数据库优化:分库分表.慢查询.长事务的优化等 阿里P8架构师谈:MySQL慢 ...

  3. JDK自带JVM分析工具详解

    JDK自带JVM分析工具详解 1. JVM分析工具概述 1.1 JVM分析工具简介 1.2 JVM分析工具分类 2. JVM分析工具详解 2.1 idea环境配置 2.2 jps 2.3 jinfo ...

  4. 详解 Tomcat 的连接数与线程池

    原文出处:编程迷思 前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文 ...

  5. spring boot 实战 / 可执行war启动参数详解

    概述   上一篇文章<spring boot 实战 / mvn spring-boot:run 参数详解>主要讲解了spring boot 项目基于maven插件启动过程中借助profil ...

  6. Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! "看看星空,会觉得自己很渺小,可能我们在宇宙中从来就是一个偶然.所以,无论什么事情,仔 ...

  7. Java消息服务JMS详解

    2019独角兽企业重金招聘Python工程师标准>>> JMS: Java消息服务(Java Message Service) JMS是用于访问企业消息系统的开发商中立的API.企业 ...

  8. 详解tomcat的连接数与线程池

    前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...

  9. 详解动态规划最长公共子序列--JavaScript实现

    前面两篇我们讲解了01背包问题和最少硬币找零问题.这篇将介绍另一个经典的动态规划问题--最长公共子序列.如果没看过前两篇,可点击下面链接. 详解动态规划最少硬币找零问题--JavaScript实现 详 ...

  10. tomcat线程释放时间_详解tomcat的连接数与线程池

    前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...

最新文章

  1. ArrayList、linklist、list的区别
  2. 验证数字的正则表达式集
  3. ASCII码表完整版
  4. 患者信息可视化及关联规则可视化
  5. 自学编程的八大误区!克服它!
  6. 14门Linux课程,打通你Linux的任督二脉!
  7. keystone 手动建立租户,用户,角色,服务,端口
  8. 三大工艺因素影响百万像素镜头成像质量
  9. 引用了System.Configuration命名空间,却找不到ConfigurationManager类
  10. 微信支付java后台
  11. prn文件导入Matlab,PPP_code(Matlab) GPS精密单点定位中的周跳探测与修复的算法研究代码 GPS develop 238万源代码下载- www.pudn.com...
  12. C#爬虫项目:SWorld阅读
  13. ANSYS ICEM常用操作
  14. LVDS的接口电路设计
  15. 抖音很火的召唤神龙的小游戏完整代码-召唤神龙
  16. VMware 中搭建 SylixOS 环境
  17. Pi滤波中磁珠和电感的使用注意事项
  18. 大数据让电商实现精准营销
  19. Pycharm安装后打开提示:此应用无法在你的电脑上运行,若要找到合适于你的电脑的版本,请咨询发布者。
  20. 4.2 人工智能产业岗位分布

热门文章

  1. 5V升压8.4V,锂电池充电管理芯片
  2. linux 快速 命令快捷键,Linux的150个命令和快捷键 整理
  3. mysql卸载安装pxc_PXC 5.7.14 安装部署
  4. 效率软件:微软远程桌面安卓版
  5. 微信mysql抽奖系统源码_微信互动游戏营销活动抽奖系统 v1.0
  6. ENVI监督分类错误:分离度为0.00000解决办法
  7. 3t studio 导出数据_Studio 3t for MongoDB 最好的MongoDB工具
  8. anjuta 连接mysql_深度商店应用Genymotion、Aptana Studio、宝塔Linux面板、Anjuta
  9. 偏振融合伪彩色图像(原理)
  10. 【安信可IDE 1.5模板专题2】安信可windows一体化环境IDE V1.5 ESP8266 SDK二次开发直连阿里云飞燕平台,天猫精灵语音控制;