JVM监控:JMX组件与底层原理

news/2024/5/15 11:15:01/文章来源:https://blog.csdn.net/xiaocaij_icai/article/details/126810442

JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架 ,从Java5.0开始引入到标准Java技术平台中。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。
其实JMX也可以看作一个框架,和我们平时使用的Spring、Hibernate也没有什么区别。只不过他已经附带到了标准java技术平台当中

应用场景:用来对应用程序的运行状态进行监控,比如对一个大型交易处理程序,我们要监控当前有多少交易在排队中,每笔交易的处理时间是多少,平均每处理一笔交易要花多少时间等等。

The JMX technology is native to the Java programming language. As a
result, it offers natural, efficient, and lightweight management
extensions to Java-based functions. It consists of a set of
specifications and development tools for managing Java environments
and developing state-of-the-art management solutions for applications
and services. It provides Java developers with the means to instrument
Java code, create smart Java agents, implement distributed management
middleware and managers, and easily integrate these solutions into
existing management and monitoring systems. The dynamics of the JMX
technology architecture enables you to use it to monitor and manage
resources as they are implemented and installed. It can also be used
to monitor and manage the Java Virtual Machine (JVM machine).

JMX最常见的场景是监控Java程序的基本信息和运行情况,任何Java程序都可以开启JMX,然后使用JConsole或Visual VM进行预览。下图是使用Jconsle通过JMX查看Java程序的运行信息

在这里插入图片描述
JConsole通过JMX展示的信息都是Java程序的通用信息,如内存情况、线程情况、类加载情况等,换言之,只要是Java程序就都具备这些信息。这些信息为我们优化程序性能、排查BUG非常有用,而JMX就是获取这些信息的基础,因此它是一种非常有用的技术。

然而JMX的强大远不止此,***它出了能提供一些通用的信息以外,还能通过特定的编程接口提供一些针对具体程序的专有信息并在JConsole等JMX客户端工具中展示,具体点说就是程序员可以把需要展示的信息放在一种叫做MBean的Java对象内,然后JConsole之类的客户端工具可以连接到JMX服务,识别MBean并在图形界面中显示。***从纯抽象的角度触发,这其实有点像浏览器发送一个请求给http服务器,然后http服务器执行浏览器的请求并返回相应的数据,从某种角度来说JConsole和JMX也是以这种方式工作的,只是它们使用的协议不是http,交换数据协议格式不是http数据包,但是他们的确是以客户端/服务器这种模式工作的,而且完成的事情也差不多。

下面我们展示JMX是如何完成此任务的。

一、定义一个展示所需信息的MBean接口

public interface ServerInfoMBean {int getExecutedSqlCmdCount();
}

在使用 Standard Mbean 作为数据传输对象的情况下这个接口的定义是必须的, 并且接口名称必须以“MBean”这个单词结尾。
二、实现具体的MBean

public class ServerInfo implements ServerInfoMBean {public int getExecutedSqlCmdCount() {return Dbutil.getExecutedSqlCmdCount();}
}

三、在程序的某个地方启动JMX服务并注册ServerInfoMBean

public static void main(String[] args)  throws JMException, Exception{MBeanServer server = ManagementFactory.getPlatformMBeanServer();ObjectName name = new ObjectName("serverInfoMBean:name=serverInfo");server.registerMBean(new ServerInfo(), name);
}

四、运行程序,并通过JConsole查看
在这里插入图片描述

从下面的架构图可以看到JMX主要分三层,分别是:设备层instrumentation level ,代理层 agent level,管理层 manager level
在这里插入图片描述


1.设备层


该层包含MBeans和它们的可管理资源。它为实现JMX技术的可管理资源提供了规范,这些资源可以是一个应用程序、服务、设备或用户。如果一个资源是用Java开发的(或提供一个Java包装),并且已经被工具化,从而可以被符合JMX的应用程序管理,那么它就是可管理的。一个资源由一个或多个标准或动态的MBeans工具化。标准MBeans是符合某些设计模式的Java对象(例如,它们必须有一个构造函数和setter/getter方法)。动态MBean符合特定的接口,在运行时提供更多的灵活性。资源的工具化允许它在代理层面上进行管理;但是,请注意,MBeans不需要了解它们所操作的JMX代理。换句话说,任何JMX可管理的资源可以使用任何提供它所需服务的JMX代理。

设备层的关键组件是MBeans、通知模型和MBean元数据类。

MBeans一个MBean是一个实现了特定接口的Java对象。
一个MBean的管理接口被表示为 (1) 可以访问的值属性;(2) 可以调用的操作;(3) 可以发出的通知;以及(4) 构造器。有四种类型的MBeans。
standard MBeans最简单的设计和实现。它们的管理界面由它们的方法名来描述。
dynamic MBeans它们实现了一个特定的接口,并在运行时公开其管理接口,以获得最大的灵活性。
open MBean依靠基本数据类型实现通用管理的动态MBeans;它们是自我描述的,以方便用户使用。
Model MBeans 动态的MBeans,在运行时可以完全配置和自我描述。它们提供了一个具有默认行为的通用MBean类,用于对资源进行动态检测。
通知模型 JMX技术定义了一个基于Java事件模型的通用通知模型。它让开发者建立主动的管理解决方案。使用通知,JMX代理和MBeans可以将关键信息发送给相关方,如管理应用程序或其他MBeans。
MBean元数据类 这些类包含了描述MBean管理界面的所有组件的结构:它的属性、操作、通知和构造器。对于其中的每一个,元数据都包括一个名称、一个描述和它的特定特征(例如,一个属性是可读的、可写的,或者两者都是;对于一个操作,它的参数和返回类型的签名)。

**

2.代理层

**

这一层包含用于暴露MBeans的JMX代理。它提供了实现代理的规范,代理控制资源并使它们对远程管理应用程序可用。代理通常位于它们所管理的资源的同一台机器上,但这并不是一个要求。JMX代理由一个MBean服务器和一组处理MBeans的服务组成。管理者通过协议适配器或连接器访问代理的MBeans并使用提供的服务。但是请注意,JMX代理不需要使用它们的远程管理应用程序的知识。

代理层面的主要组件是MBean服务器和代理服务。

MBean Server一个对象的注册表,这些对象在代理中被暴露于管理操作。任何在MBean服务器上注册的对象对管理应用程序都是可见的。然而,请注意,MBean服务器只公开MBean的管理接口,而不是它的直接对象引用。任何你想从代理的JVM之外管理的资源必须在服务器中注册为一个MBean。服务器还提供了一个标准化的接口,用于访问同一JVM内的MBeans,使本地对象拥有操作可管理资源的所有好处。MBeans可以被另一个MBean、代理本身或通过分布式服务的远程管理应用程序实例化和注册。当你注册一个MBean时,你必须给它分配一个唯一的对象名称,管理应用程序使用该名称来识别要执行管理操作的对象。
Agent Services可以对在MBean服务器中注册的MBeans执行管理操作的对象。通过在代理中包括管理智能,JMX帮助你建立更强大的管理解决方案。
JMX API定义了J2SE 5.0中可用的下列代理服务。
动态类加载器。通过管理小程序(m-let)服务,从任意的网络位置检索并实例化新的类和本地库。
监控器。观察几个MBeans的属性的数字或字符串值,并可以通知其他对象目标中的几种变化类型。
计时器。提供一个基于一次性报警时钟通知或基于重复、定期通知的调度机制。
关系服务。定义MBeans之间的关联,并根据预定义的关系类型来强制执行关系的cardinality。

**

3. 管理(或分布式服务)层

**

该层包含使管理应用程序与JMX代理进行通信的组件。它提供了实现JMX管理器的接口,并定义了对代理进行操作的管理接口和组件。这些组件为管理应用程序提供了一个接口,使其能够通过连接器与代理及其JMX可管理资源进行交互,还通过将JMX代理及其MBeans的语义映射到数据丰富的协议(如HTML)的结构中,公开了JMX代理的管理视图。

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

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

相关文章

一建报名重大变动 部分专业考生2022年不能报名一级建造师考试?

2022年度一级建造师资格考试报名证明事项实行告知承诺制,应试人员须通过中国人事考试网的全国专业技术人员资格考试报名服务平台进行网上注册、报名和缴费。 云南报名时间:2022年9月14日—9月21日;缴费截止时间:9月14日—9月23日…

【Android】App开发-控件篇

App开发是一个工作量比较大的项目,要学习App开发首先我们要先去学习手机中的各类工具和信息是怎么运行的,我们可以使用哪些工具来对手机进行设置。这里我采用的开发工具是Android studio。 目录 Textview控件 文本框控件: 阴影/模糊度控件…

第12章 软件测试基础 12.1-软件测试 12.2-验证与确认 12.3-软件缺陷

目录 一、软件测试基础主要内容 二、软件测试 1、软件测试的定义 2、软件测试的对象 3、软件测试的目的 4、考点 (1)软件测试的目的 (2)软件测试的对象 三、验证与确认 1、验证(Verification) 2、确认&…

pycharm安装opencv-python报错

嘿嘿,大家好,我又遇到拦路的小可爱了! 报错内容 3): Read timed out. WARNING: You are using pip version 21.3.1; however, version 22.2.2 is available. You should consider upgrading via the E:\daimabao\python\bigdata\Scripts\pyt…

【小月电子】安路国产FPGA开发板系统学习教程-LESSON7串口通信

串口通信例程讲解若要观看该博客配套的视频教程,可点击此链接根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中一些步骤。比如非常简单的项目,我们可以省去虚线框里面的…

【数据结构】二叉树的遍历

文章目录 5.3 二叉树的遍历 5.3.1 概述 5.3.2 遍历方式【重点】 5.3.3 遍历方式:递归实现【重点】 5.3.4 遍历方式:非递归实现 5.3 二叉树的遍历 5.3.1 概述 二叉树的遍历:沿着某条搜索路径对二叉树中的结点进行访问,使得每…

grpc|protobuf的安装、编译、运行笔记(C++)

一、下载grpc源码 如果你的电脑/服务器可以做代理,然后稳定链接上 GitHub 那么完全可以按照 GitHub 的官方文档来操作,我这里采用 Gitee 镜像来操作 git clone https://gitee.com/jiangxy__loey/grpc.git二、下载依赖库 进入grpc目录,然后…

为什么残差连接的网络结构更容易学习?

为什么残差连接的网络结构更容易学习? 【写在前面】 不仅仅在resnet中,在各种网络结构中大家都喜欢使用残差连接的设计,并声称这有利于网络的优化,这是为什么呢?能给出一个有说服力的答案吗? Why the re…

1.数据校验-拦截器-全局异常-json数据处理

目录 1.数据校验-拦截器-全局异常-json数据处理 1. JSR303 2. JSR303中含有的注解 3. spring中使用JSR303进行服务端校验 3.1 导入依赖包 3.2 添加验证规则 3.3执行校验 3.4 错误信息的展示 4. SpringMVC定义Restfull接口 5.1 增加spring配置 5.2 Controller 5.3 格…

Mstsc(远程桌面连接)命令的高级用法

Mstsc远程桌面连接,这个是微软操作系统自带的一个命令,相信很多人都用过,但是如果说这个命令还有高级用法,估计很多人都没有用过,其实这个命令还是很强大的,今天咱们就来说一下mstsc的高级用法Mstsc远程桌面连接,这个是微软操作系统自带的一个命令,相信很多人都用过,但…

20220912--CSP-S模拟4

A. 石子游戏 B. 大鱼吃小鱼 C. 黑客 D. 黑客-续A. 石子游戏 首先了解一个叫做 \(\operatorname{Nim}\) 游戏的玩意 通常的 \(\operatorname{Nim}\) 游戏的定义是这样的: 有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)” 如果轮…

自制操作系统日志——第十二天

自制操作系统日志——第十二天 从今天开始,我们将花费两天的时间来进行计算机中定时器的制作。有了定时器后,才能够为程序和cpu更加便利的进行计时。可能会稍难一些了!!! 做好准备,冲!&#xf…

ConcurrentLinkedQueue解析

概述 ConcurrentLinkedQueue实际对应的是LinkedList,是一个线程安全的无界队列,但LinkedList是一个双向链表,而ConcurrentLinkedQueue是单向链表。ConcurrentLinkedQueue线程安全在于设置head、tail以及next指针时都用的cas操作,而且node里的…

00Android studio安装

目录一.下载Android studio二.安装Android studio三.打开软件一.下载Android studio 官网:https://developer.android.google.cn/studio 下载:由于是国外的网站,国内下载会比较慢 二.安装Android studio 打开: 点击【Next】 点击…

猿创征文|瑞吉外卖——管理端_员工管理

个人名片: 博主:酒徒ᝰ. 专栏:瑞吉外卖 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。 本篇励志:一本好书,就像高级武功秘籍一样,哪怕只是从里面领悟到个一招半势&…

C# StringBuilder 底层深入原理分析以及使用详解

目录前言什么是StringBuilderStringBuilder的成员StringBuilder增加元素原理StringBuilder扩容原理Capacity:1,元素数量:0Capacity:1,元素数量:1Capacity:2,元素数量:2Ca…

开学季征文|卷生卷死之新学期大学生自救指南!!!

你好,这里是前情提要 正所谓 “ 宁可卷死自己,也要卷死同学 ” ,在这个万物皆卷的时代,“卷”似乎早已与我们变得不可分割血脉相融,有道是卷卷更健康。我也知道卷卷更好,可是天不遂人愿,因为疫情…

Redis_09_Redis集群实现Sentinel哨兵应对高可用

文章目录一、前言二、Sentinel原理2.1 Sentinel原理2.2 Sentinel选主2.3 Sentinel功能小结三、Sentinel实践3.1 Sentinel配置3.2 实践:Sentinel基本使用3.2.1 实践:Sentinel搭建3.2.2 实践:主节点宕机之后的选主过程(Sentinel保证高可用)3.2.…

ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法

这个解决办法是我根据网上一系列的方法准备突然成功的,所以我想可能是由于本身其不稳定造成的 首先,我在官网上下载了mysql文件,这个网上随便找都能找到怎么下载的 然后打开文件后,发现没有my.ini 所以我就找了一个文档放了进去…

【线性代数】MIT Linear Algebra Lecture 6: Column space and nullspace

Author| Rickyの水果摊 Time | 2022.9.12 Lecture 6: Column space and nullspace Lecture Info Instructor: Prof. Gilbert Strang Course Number: 18.06 Topics: Linear Algebra Official Lecture Resource: Resource Index of Linear Algebra …