jvm之JMX

news2024/11/30 6:53:39

写在前面

本文来看先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";

    @Override
    public String getName() {
        return "风筝";
    }

    @Override
    public String getPassword() {
        return "密码不可见";
    }

    @Override
    public String getPhone() {
        return "18900000000";
    }

    @Override
    public void say() {
        System.out.println("Hello JMX");
    }

    @Override
    public 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方式连接JMXConnectorServer
            LocateRegistry.createRegistry(8999);
            //URL路径的结尾可以随意指定,但如果需要用Jconsole来进行连接,则必须使用jmxrmi
            JMXServiceURL 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.coloradmin.cn/o/572118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springAop原理分析-动态代理对象创建过程分析

概念 AspectJ Aspect 切面(由多个切点组成,多个点组成面) 启用AspectJ支持后,Spring 会自动检测出在应用程序上下文中定义的任何 Bean,如下使用Aspect 定义的一个切面示例。 package org.xyz; import org.aspectj.…

STM8、STM8S003F3P6 实现PWM控制电机HAS10227

背景 有个项目需要控制一台风机的转速,使用STM8S003F3P6 输出PWM控制,这里就详细记录一下调试记录 原理图 原理图比较简单,电机接口CN3 电机接口原理图 与MCU管脚连接位置如下图 首先我们要明白电机的原理 电机 简单来说就是 实现电能与…

闲置手机建站 - 安卓Termux+Hexo搭建属于你自己博客网站【cpolar实现公网访问】

文章目录 1. 安装 Hexo2. 安装cpolar内网穿透3. 公网远程访问4. 固定公网地址 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并…

助力工业物联网,工业大数据之一站制造业务主题划分【十三】

文章目录 01:一站制造业务主题划分02:一站制造业务维度设计03:一站制造业务主题维度矩阵 01:一站制造业务主题划分 目标:掌握一站制造的主题域及主题的划分实施 来源 主题域划分:业务或者部门划分 业务&am…

PHP基于xlswriter支持无限表头层级Excel导出

本章介绍基于PHP扩展xlswriter的Vtiful\Kernel\Excel类可以支持无限层级的复杂表头导出! 废了九牛二虎之力,终于把这个功能类写完了…后续会持续更新优化 准备xlswriter扩展 windows系统: 到PECL网站下载符合自己本地PHP环境的ddl文件下载地…

Java内部类(成员内部类、静态嵌套类、方法内部类、匿名内部类)

文章目录 一、内部类的共性二、为什么需要内部类三、静态内部类(静态嵌套类)四、成员内部类五、局部内部类(方法内部类)六、匿名内部类 Java 类中不仅可以定义变量和方法,还可以定义类,这样定义在类内部的类…

WSL2+windows terminal

WSL2的安装与使用-Windows与Linux双系统的新选择 既要使用Windows系统满足日常生活,协作办公,又要使用Linux系统满足开发工作,双系统来回重启好麻烦,双主机成本高,远程服务器好多限制,WSL也许是更好的解决…

“智慧赋能 强链塑链”——打造电力特色智慧供应链体系

构建业务数智化、资源集约化、运营一体化、发展绿色化的智慧供应链体系,是电力企业实现智慧供应链建设的使命和目标。同时,在国内外双循环、一带一路、建立统一大市场的政策背景推动下,企业经营和居民生活对电力的需求仍然强劲并持续增长&…

Seata AT模式源码解析一(Seata Server端启动流程)

文章目录 启动类 ServerSessionHolder初始化DefaultCoordinator初始化初始化NettyRemotingServer 启动类 Server seata-server的入口类在Server类中,源码如下: public class Server {/*** The entry point of application.** param args the input arg…

Intel Realsense D405 在Ubuntu18.04下使用kalibr标定

目录 一. 在ubuntu下使用kalibr标定realsense_ros的安装总结下面是标定步骤 一. 在ubuntu下使用kalibr标定 在Realsense官网上librealsense现在D405只接受ROS2下的环境(相机确实很新) 在ROS1下我想到了改设备ID号的方式进行标定 这里需要注意libreals…

蓝桥杯并查集总结

本文先是给出三篇并查集原理解释文章链接,又提供了python代码模版;而后给出了一份蓝桥杯并查集的题单,并附有部分题目及其求解思路、代码。 目录部分 并查集原理 python代码 并查集题单 蓝桥幼儿园 题目描述 输入描述 输出描述 输入…

ERP有哪些系统?运用在哪些行业?

国内目前市面上ERP系统五花八门,但能真正快速匹配企业业务,且可以进行快速迭代二次开发的系统并不多见。 所以在选择ERP系统的时候可以参考下面这张表格中的内容: 目前常见的ERP软件大概可以分为三大类: ① 标准ERP应用&#xf…

白银实时价格应该在最适合的地方下注

小时候我们看战争片,总是发现主角们带兵打仗,战无不胜,偶尔有一场大的失利,但是总是能耐化险为夷,逢凶化吉,甚至最后成功反扑、反败为胜。后来小编一琢磨,发现,其实这些将才们打仗&a…

如何使用C++ 在Word文档中创建列表

列表分类是指在Word文档中使用不同格式排序的列表,来帮助我们一目了然地表达出一段文字的主要内容。比如,当我们描述了某个主题的若干点,就可以用列表把它们一一表达出来,而不是写成完整的段落形式。同时,列表也可以帮…

如何查看mysql里面的锁(详细)

通过查询表统计信息查看 information_schema库下相关事务表和锁相关信息表介绍innodb_trx存储了当前正在执行的事务信息trx_id:事务ID。trx_state:事务状态,有以下几种状态:RUNNING、LOCK WAIT、ROLLING BACK 和 COMMITTING。trx…

各位自学网络安全的同学,你们的学习路线真的对吗

最近在知乎上看到很多问题,都是小白想要转行网络安全行业咨询学习路线和学习资料的,作为一个培训机构,学习路线和免费学习资料肯定是很多的。机构里面的不是顶级的黑阔大佬就是正在学习的同学,也用不上这些内容,每天都…

Educational Codeforces Round 139 (Rated for Div. 2)

Educational Codeforces Round 139 (Rated for Div. 2) Problem - 1766E - Codeforces 显然我们可以把0序列的贡献单独算: i*(n-i1) 考虑只存在1,2,3的情况. 首先通过,观察到一个重要性质: 最多只有三种序列. 含有3或纯1或纯2型.纯1或纯2型纯2或纯1型 我们每次添加…

照片资源异地共享 ? tftgallery、xampp、快解析三种工具就能实现!

我的工作中,经常会收到处理各种图片的任务,在处理完图片之后,怎么发送给客户呢?传输的实现,需要一个安全而稳定的环境和即时方便的工具去进行操作与下载。一般情况下,我们大多会选择微信、QQ来作为传输下载…

Seata AT模式源码解析三(AT模式工作机制)

文章目录 代码示例流程源码解析开启全局事务注册分支事务一阶段提交全局事务提交分支事务二阶段提交全局事务回滚分支事务二阶段回滚 代码示例 从一个微服务示例开始,案例采用Seata官方提供的Demo。 用户购买商品的业务逻辑。整个业务逻辑由3个微服务提供支持&…

五大网络IO模型

网络IO模型 1. IO是什么? I/O(英语:Input/Output),即输入/输出,通常指数据在存储器(内部和外部)或其他周边设备之间的输入和输出,是信息处理系统&#xff0…