jvm之JMX

news/2024/5/12 5:14:09/文章来源:https://blog.csdn.net/wang0907/article/details/130885349

写在前面

本文来看先jmx相关内容。

1:jmx介绍

jvm在运行的过程中有很多的信息,比如堆内存,线程数,加载的类信息,CPU的使用量等,如果我们想要将这些信息暴漏让外界获取,该怎么做呢?此时就需要用到jmx技术了,jmx技术的全称时Java management extension,即,Java管理扩展。那么首先,Java作为面向对象的语言,自然要先将需要暴漏的信息以某种形式组织起来了,组织的形式也比较简单,就是定义bean,只不过因为其用于管理用途,所以叫做management bean,即MBean,看似神秘,其实比较纯粹,和普通的Java bean没有任何区别,也是封装了一组属性(如可能CPU使用率属性等)和操作(如可能执行gc的操作,以及自定义的其他方法等)。MBean不止一个,有很多很多,为了方便MBean的管理,Java定义MbeanServer来完成MBean的统一管理工作,但是此时还不能暴漏到外界,暴漏到外界还需要用到rmi连接器,之后诸如jconsole,jvisualvm等工具就可以通过rmi连接到jvm获取各种MBean,并从中读取信息来展示,供用户进行管理和查看工作了,架构图如下:

在这里插入图片描述

2:自定义MBean

想要自定义MBean,我们首先需要创建接口,接口名称要以MBean结尾,如下:

public interface UserMBean {String getName();String getPassword();String getPhone();void say();void changeUrl(String url);
}

然后我们就可以定义一个实现类作为MBean,如下:

public class User implements UserMBean {private static String url = "https://zhuanlan.zhihu.com/p/166530442";@Overridepublic String getName() {return "风筝";}@Overridepublic String getPassword() {return "密码不可见";}@Overridepublic String getPhone() {return "18900000000";}@Overridepublic void say() {System.out.println("Hello JMX");}@Overridepublic void changeUrl(String url) {System.out.println("url值修改前为:" + User.url);User.url = url;System.out.println("url值修改后为:" + User.url);}
}

定义完毕之后,还必须将MBean注册到MbeanServer中,以及设置rmi地址等,具体如下:

public class Main {public static void main(String[] args) throws Exception {MBeanServer server = ManagementFactory.getPlatformMBeanServer();// ObjectName 是 MBean 的唯一标示,一个 MBeanServer 不能有重复。完整的格式「自定义命名空间:type=自定义类型,name=自定义名称」ObjectName userName = new ObjectName("FengZheng:type=customer,name=customerUserBean");// 注册MBean到mbeanserver中,并指定唯一名称server.registerMBean(new User(), userName);try {//这个步骤很重要,注册一个端口,绑定url后用于客户端通过rmi方式连接JMXConnectorServerLocateRegistry.createRegistry(8999);//URL路径的结尾可以随意指定,但如果需要用Jconsole来进行连接,则必须使用jmxrmiJMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8999/jmxrmi");JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);System.out.println("begin rmi start");jcs.start();System.out.println("rmi start");} catch (RemoteException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}Thread.sleep(60 * 60 * 1000);}}

这样运行之后,我们就可以通过jconsole工具中的mbean tab前看到我们自定义的MBean相关的属性信息,以及方法信息了,如下:
在这里插入图片描述

除了直接查看属性的值之外,还可以直接执行方法,如下执行say方法:

在这里插入图片描述

执行changeUrl方法,可以录入参数,如下:

在这里插入图片描述

当然我们也可以通过rmi来连接到jmx,实现自己的jconsole,如下:

public class Client {public static void main(String[] args) throws IOException, Exception, NullPointerException {String jmxUrl = "service:jmx:rmi:///jndi/rmi://localhost:8999/jmxrmi";monitor(jmxUrl);}public static void monitor(String url) throws Exception{JMXServiceURL jmxServiceURL = new JMXServiceURL(url);JMXConnector jmxc = JMXConnectorFactory.connect(jmxServiceURL, null);MBeanServerConnection msc = jmxc.getMBeanServerConnection();String[] domains = msc.getDomains();for (String domain : domains) {System.out.println(domain);}}
}

运行如下:

JMImplementation
java.util.logging
java.lang
com.sun.management
java.nio
FengZheng

3:jdk自带MBean

jdk自带的MBean在java.lang.management包下,如下:

在这里插入图片描述

这些MBean都可以通过MBean的工厂类ManagementFactory获取,如下图:

在这里插入图片描述

我们来看下其中的RuntimeMBean,如下:

public class JdkMBeanTest {public static void main(String[] args) {RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();System.out.println("jvm名称:" + runtimeMXBean.getName());System.out.println("启动类加载器加载路径:" + runtimeMXBean.getBootClassPath());System.out.println("classpath: " + runtimeMXBean.getClassPath());System.out.println("启动时间(ms):" + runtimeMXBean.getStartTime());System.out.println("运行时长(ms):" + runtimeMXBean.getUptime());System.out.println("vm厂家:" + runtimeMXBean.getSpecVendor());System.out.println("vm版本:" + runtimeMXBean.getSpecVersion());System.out.println("系统属性:" + runtimeMXBean.getSystemProperties());}
}

运行如下:
在这里插入图片描述

这些信息在jsoncole的mbean中也是可以获取的,其实获取的方式和我们是一样的如下:

在这里插入图片描述

通过MemoryMXBean查看堆内存:

在这里插入图片描述

通过ClassLoadingMXBean查看类加载和卸载信息:

在这里插入图片描述

通过GarbageCollectorMXBean查看GC信息:

在这里插入图片描述

写在后面

参考文章列表

面试官问我 JMX 了解不,我说:什么? 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_306479.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

池州控股集团财务共享项目启动啦!

近日,由用友网络承建的池州市投资控股集团有限公司财务共享项目启动会成功举办,也标志着池州控股集团财务共享项目正式启动!池州控股集团总经理刘俊、用友国资事业部总经理汪发清及其他相关专家和项目组主要成员参加了此次启动会。 池州投控集…

档案馆空气质量在线3D监控系统温湿度方案

档案馆库房八防温湿度空气质量一体化解决方案 档案库房是档案事业发展的基石,其主要任务是集中保管国家机构及个人等在各种形式下形成的具有一定价值和保存价值的各种载体档案,主要包括文书档案、科技档案、会计档案、人事档案、实物档案等。随着我国经济…

Node版本管理器nvm的安装与使用

前言: 多项目新旧项目管理的时候,往往与依赖不同的node版本,不同的版本对其他依赖的安装有一定的影响,因此我们需要对node的版本进行方便快捷管理和切换,如果直接卸载重装对应版本,切换项目再次卸载重装明显…

【泛微ecology_oracle】如何把查询到的单列人力资源id合并成多人力资源格式

如何把查询到的单列人力资源id合并成多人力资源格式 在泛微ecology中,单列人力资源id合并成多人力资源的使用场景在泛微ecology中,在数据库里人员姓名存储形式那如何实现人力资源字段合并多人力资源字段呢? 在泛微ecology中,单列人…

Rancher添加集群报错:Etcd Cluster is not healthy

原因: 有一台虚拟机在升级内核失败后,回滚至快照。但由于快照版本太老旧,和当前的rancher版本不匹配,服务器上的agent等需要清楚后,重新在rancher添加集群;但是只删除了rancher镜像以及agent相关容器&#…

开源开放 生态共建 | openKylin社区单位会员突破200家!

当前,开放、协作、共享的开源模式已成为全球软件技术和产业创新的主导,也为信息技术国产自主化提供了强大助力。openKylin作为中国桌面操作系统开源社区,以聚焦桌面操作系统根技术为核心、以孵化相关领域关键项目为目标、以布道开源文化为抓手…

关闭linux kernel内核的启动log在控制台的输出

要关闭Linux内核的启动日志,你可以通过以下方法之一进行操作: 1. 通过引导加载器配置: 打开引导加载器的配置文件,如GRUB的配置文件 /boot/grub/grub.cfg。 在内核的启动行(以 “linux” 或 “kernel” 开头&#xf…

[论文评析]C-Mixup: Improving Generalization in Regression, NeurIPS,2022

C-Mixup: Improving Generalization in Regression 前言C-MixupReferences 前言 Mixup方法是针对分类任务的, 这篇方法相当于时提出了regression版本的Mixup, 实验证实能够大幅提升在regression task上的泛化能力. C-Mixup 是否可以把Mixup直接用于Regression task呢? 在原…

这可能是最全面的Java学习路线了

大家好,我是大彬~ 我本科学的不是计算机,大四开始自学Java,并且拿到了几个互联网中大厂的offer。在学习Java这方面还是比较有经验的,下面我来分享下我整理的Java自学路线。 在这里也提醒学弟学妹们,要尽早确定以后的…

数字档案馆建设指南

数字档案馆建设指南 目 录 1.总体要求 2.管理系统功能要求 3.应用系统开发和服务平台构建 4.数字档案资源建设 5.保障体系建设 1.总体要求 1.1概述 数字档案馆是指各级各类档案馆为适应信息社会日益增长的对档案信息资源管理、利用需求,运用现代信息技术对数字…

【问题记录】postgreSQL使用默认密码导致kdevtmpfsi挖矿病毒注入

起因 postgreSQL我做错了这几件事情 开启了全部IP登陆权限postgreSQL用的是默认用户名和密码用户postgres也没有设置密码,直接用su - postgres就能登陆 不知道是什么原理,反正服务器被侵入,并且注入了病毒文件 1. 基本信息排查 linux服务器…

Kafka实时数据即席查询应用与实践

作者:vivo 互联网搜索团队- Deng Jie Kafka中的实时数据是以Topic的概念进行分类存储,而Topic的数据是有一定时效性的,比如保存24小时、36小时、48小时等。而在定位一些实时数据的Case时,如果没有对实时数据进行历史归档&#xff…

用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能。

Vue3 的父子组件传值、绑定表单数据、UI库的二次封装、防抖等,想来大家都很熟悉了,本篇介绍一种使用 Typescript 的方式进行统一的封装的方法。 基础使用方法 Vue3对于表单的绑定提供了一种简单的方式:v-model。对于使用者来说非常方便&…

镜像二叉树和求二叉树最大深度(java)

镜像二叉树和求二叉树最大深度 镜像二叉树。有些题目叫翻转二叉树。是同一个题。二叉树的最大深度 镜像二叉树。有些题目叫翻转二叉树。是同一个题。 题目描述:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例&#xff1…

基于LLMs的多模态大模型(Visual ChatGPT,PICa,MM-REACT,MAGIC)

当LLMs已经拥有了极强的对话能力后,如何使其拥有视觉和语音等多模态能力是紧接而来的热点(虽然GPT4已经有了),这个系列将不定期更新一些利用LLMs做多模态任务的文章。 直觉上,如果直接训练一个类似chatgpt架构的多模态…

sql查询指定数据的函数(等于、and、or、in、find_in_set、like)

sql查询指定数据的函数(等于、and、or、in、find_in_set、like): 1.查询指定单字段的指定数据: 举例:查询user表中address字段数据等于aa的数据; select * from user where address aa 2.查询指定多字段…

【2023 · CANN训练营第一季】MindSpore模型快速调优攻略 第一章——调试调优背景介绍

1.模型迁移、模型调试调优背景介绍 模型训练\推理过程中可能遇到的问题: • 代码编写错误,问题难以定位; • 模型结构错误; • 权重更新错误; • 损失函数设计错误; • 半精度下计算溢出; • L…

Kali-linux Gerix Wifi Cracker破解无线网络

Gerix Wifi Cracker是另一个aircrack图形用户界面的无线网络破解工具。本节将介绍使用该工具破解无线网络及创建假的接入点。 9.3.1 Gerix破解WEP加密的无线网络 在前面介绍了手动使用Aircrack-ng破解WEP和WPA/WPA2加密的无线网络。为了方便,本小节将介绍使用Geri…

​路由器端口映射怎么设置?内网IP不能映射怎么办?​

使用路由器后,Internet用户无法访问到局域网内的主机,因此不能访问内网搭建的Web、FTP、Mail等服务器。路由器 端口映射功能可以实现将内网的服务器映射到Internet,从而实现服务器对外开放。 建议在设置路由器端口映射之前,确认以…

基于北斗+LoRa的落水报警定位方案一 -实现无人区,弱信号地区人员 位置安全监控

人员安全一直是企业管理的重中之重。无人区工地是一个安全事故多发的地方,在施工环境复杂且危险的情况下,工地人员位置监控成为管理工作中的一个难点,一直以来采用粗放的方式,现有的工地项目存在施工人员实时督查难等问题&#xf…