JMX详解及JConsole使用
JMX
JMX(Java Management Extensions)是一个应用程序植入管理功能的框架,是一套标准的代理和服务,服务是JDK官方提供的Java程序性能监控程序。支持远程访问,支持扩展,即自定义监控的性能参数。提供网络、API、客户端三个层次的调用。实际上,Java平台使用JMX作为管理和监控的标准接口,任何程序只要按JMX规范访问这个接口,就可以获取所有的管理和监控信息。常用的运维监控如Zabbix、Nagios等工具对JVM本身的监控都是通过JMX获取的信息。
应用场景
中间件软件WebLogic的管理页面就是基于JMX开发的,而JBoss则是整个系统都基于JMX架构,对于一些参数的修改,有几种方式如下:
写死在代码里,需要改动的时候去修改,然后重新编译发布。
写在配置文件里,例如java的properties,需要改变时,只需要修改配置文件,但必须重启系统才能生效。
写一段代码,把配置值缓存起来,系统在获取的时候,先看看配置文件改动没,如有改动,则从配置里获取最新值,否则从缓存里读取,例如读取Apollo配置中心数据。
用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 主要是提供对资源你的注册和管理
接入层
提供远程访问入口
使用方法
- 编写MBean提供的管理接口和监控数据。
- 注册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使用相关推荐
- JMX详解以及使用示例
目录 目录 JMX是什么 JMX架构 MBean 标准MBean 定义接口 实现接口 注册MBean 使用MBean 如何通过Web管理MBean 开放类型MBean 自定义参数 MXBean接口定义 ...
- 4大JVM性能分析工具详解,及内存泄漏分析方案
谈到性能优化分析一般会涉及到: Java代码层面的,典型的循环嵌套等 还会涉及到Java JVM:内存泄漏溢出等 MySQL数据库优化:分库分表.慢查询.长事务的优化等 阿里P8架构师谈:MySQL慢 ...
- JDK自带JVM分析工具详解
JDK自带JVM分析工具详解 1. JVM分析工具概述 1.1 JVM分析工具简介 1.2 JVM分析工具分类 2. JVM分析工具详解 2.1 idea环境配置 2.2 jps 2.3 jinfo ...
- 详解 Tomcat 的连接数与线程池
原文出处:编程迷思 前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文 ...
- spring boot 实战 / 可执行war启动参数详解
概述 上一篇文章<spring boot 实战 / mvn spring-boot:run 参数详解>主要讲解了spring boot 项目基于maven插件启动过程中借助profil ...
- Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! "看看星空,会觉得自己很渺小,可能我们在宇宙中从来就是一个偶然.所以,无论什么事情,仔 ...
- Java消息服务JMS详解
2019独角兽企业重金招聘Python工程师标准>>> JMS: Java消息服务(Java Message Service) JMS是用于访问企业消息系统的开发商中立的API.企业 ...
- 详解tomcat的连接数与线程池
前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...
- 详解动态规划最长公共子序列--JavaScript实现
前面两篇我们讲解了01背包问题和最少硬币找零问题.这篇将介绍另一个经典的动态规划问题--最长公共子序列.如果没看过前两篇,可点击下面链接. 详解动态规划最少硬币找零问题--JavaScript实现 详 ...
- tomcat线程释放时间_详解tomcat的连接数与线程池
前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...
最新文章
- ArrayList、linklist、list的区别
- 验证数字的正则表达式集
- ASCII码表完整版
- 患者信息可视化及关联规则可视化
- 自学编程的八大误区!克服它!
- 14门Linux课程,打通你Linux的任督二脉!
- keystone 手动建立租户,用户,角色,服务,端口
- 三大工艺因素影响百万像素镜头成像质量
- 引用了System.Configuration命名空间,却找不到ConfigurationManager类
- 微信支付java后台
- prn文件导入Matlab,PPP_code(Matlab) GPS精密单点定位中的周跳探测与修复的算法研究代码 GPS develop 238万源代码下载- www.pudn.com...
- C#爬虫项目:SWorld阅读
- ANSYS ICEM常用操作
- LVDS的接口电路设计
- 抖音很火的召唤神龙的小游戏完整代码-召唤神龙
- VMware 中搭建 SylixOS 环境
- Pi滤波中磁珠和电感的使用注意事项
- 大数据让电商实现精准营销
- Pycharm安装后打开提示:此应用无法在你的电脑上运行,若要找到合适于你的电脑的版本,请咨询发布者。
- 4.2 人工智能产业岗位分布
热门文章
- 5V升压8.4V,锂电池充电管理芯片
- linux 快速 命令快捷键,Linux的150个命令和快捷键 整理
- mysql卸载安装pxc_PXC 5.7.14 安装部署
- 效率软件:微软远程桌面安卓版
- 微信mysql抽奖系统源码_微信互动游戏营销活动抽奖系统 v1.0
- ENVI监督分类错误:分离度为0.00000解决办法
- 3t studio 导出数据_Studio 3t for MongoDB 最好的MongoDB工具
- anjuta 连接mysql_深度商店应用Genymotion、Aptana Studio、宝塔Linux面板、Anjuta
- 偏振融合伪彩色图像(原理)
- 【安信可IDE 1.5模板专题2】安信可windows一体化环境IDE V1.5 ESP8266 SDK二次开发直连阿里云飞燕平台,天猫精灵语音控制;