Java 监控基础 - 使用 JMX 监控和管理 Java 程序

JMX 技术为 Java 开发者提供了一种简单、灵活、标准的方式来监测 Java 应用程序,得益于相对独立的架构设计,使 JMX 可以平滑的集成到各种监控系统之中。

下面列举几项 JMX 的具体优点:

  1. 开箱即用的监控功能,JMX 是 Java SE 的标准部分,提供了资源管理、服务托管、远程监控等管理基础功能,都可以直接启用。

  2. JMX 技术提供了一种通用的、标准的资源、系统、应用程序、网络的管理方式,不仅可以本地使用、远程使用;还可以扩展到其他场景,如 Java EE 应用等。

  3. JMX 技术提供了对 JVM 状态的监测功能,JMX 已经内置了对 JVM 的监测功能,并且可以监控和管理 JVM,十分方便。

  4. JMX 架构设计优秀,组件化的设计可以自由的扩展。

  5. JMX 技术严格遵守 Java 现有规范如 JNDI 规范。

  6. JMX 可以自由的与其他管理解决方案集成,得益于开放的 JMX API,可以通过 web 服务管理 JMX 中的资源。

3. JMX 的技术架构


JMX 技术架构主要有资源管理(MBean/MXBean)模块,资源代理模块(MBean Server),远程管理模块(Remote API)组成 ,下面的图片来自维基百科,很好的展示了三个模块之间的关系。

图片来自维基百科

3.1. 资源管理 MBean

资源管理在架构中标识为资源探测层(Probe Level),在 JMX 中, 使用 MBeanMXBean 来表示一个资源(下面简称 MBean),访问和管理资源也都是通过 MBean,所以 MBean 往往包含着资源的属性和操作方法

JMX 已经对 JVM 进行了多维度资源检测,所以可以轻松启动 JMX 代理来访问内置的 JVM 资源检测,从而通过 JMX 技术远程监控和管理 JVM。

下面列举 JMX 对 JVM 的资源检测类,都可以直接使用。

| 资源接口 | 管理的资源 | Object Name | VM 中的实例个数 |

| — | — | — | — |

| ClassLoadingMXBean | 类加载 | java.lang:type= ClassLoading | 1个 |

| CompilationMXBean | 汇编系统 | java.lang:type= Compilation | 0 个或1个 |

| GarbageCollectorMXBean | 垃圾收集 | java.lang:type= GarbageCollector, name=collectorName | 1个或更多 |

| LoggingMXBean | 日志系统 | java.util.logging:type =Logging | 1个 |

| MemoryManagerMXBean | 内存池 | java.lang: typeMemoryManager, name=managerName | 1个或更多 |

| MemoryPoolMXBean | 内存 | java.lang: type= MemoryPool, name=poolName | 1个或更多 |

| MemoryMXBean | 内存系统 | java.lang:type= Memory | 1个 |

| OperatingSystemMXBean | 操作系统 | java.lang:type= OperatingSystem | 1个 |

| RuntimeMXBean | 运行时系统 | java.lang:type= Runtime | 1个 |

| ThreadMXBean | 线程系统 | java.lang:type= Threading | 1个 |

下面的代码示例演示了使用 JMX 检测 JVM 某些信息的代码示例。

package com.wdbyte.jmx;

import java.lang.management.CompilationMXBean;

import java.lang.management.GarbageCollectorMXBean;

import java.lang.management.ManagementFactory;

import java.lang.management.MemoryMXBean;

import java.lang.management.MemoryManagerMXBean;

import java.lang.management.MemoryUsage;

import java.lang.management.OperatingSystemMXBean;

import java.util.List;

import java.util.stream.Collectors;

/**

  • JMX JVM

  • @author https://www.wdbyte.com

*/

public class JavaManagementExtensions {

public static void main(String[] args) {

OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();

String osName = operatingSystemMXBean.getName();

String osVersion = operatingSystemMXBean.getVersion();

int processors = operatingSystemMXBean.getAvailableProcessors();

System.out.println(String.format(“操作系统:%s,版本:%s,处理器:%d 个”, osName, osVersion, processors));

CompilationMXBean compilationMXBean = ManagementFactory.getCompilationMXBean();

String compilationMXBeanName = compilationMXBean.getName();

System.out.println(“编译系统:” + compilationMXBeanName);

MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();

MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();

long max = heapMemoryUsage.getMax();

long used = heapMemoryUsage.getUsed();

System.out.println(String.format(“使用内存:%dMB/%dMB”, used / 1024 / 1024, max / 1024 / 1024));

List gcMXBeans = ManagementFactory.getGarbageCollectorMXBeans();

String gcNames = gcMXBeans.stream()

.map(MemoryManagerMXBean::getName)

.collect(Collectors.joining(“,”));

System.out.println(“垃圾收集器:” + gcNames);

}

}

运行可以得到如下结果:

操作系统:Mac OS X,版本:11.6,处理器:12 个

编译系统:HotSpot 64-Bit Tiered Compilers

使用内存:3MB/4096MB

垃圾收集器:G1 Young Generation,G1 Old Generation

3.2. 资源代理 MBean Server

资源代理 MBean Server 是 MBean 资源的代理,通过 MBean Server 可以让 MBean 资源用于远程管理, MBean 资源和 MBean Server 往往都是在同一个 JVM 中,但这不是必须的。

想要 MBean Server 可以管理 MBean 资源,首先要把资源注册到 MBean Server,任何符合 JMX 的 MBean 资源都可以进行注册,最后 MBean Server 会暴露一个远程通信接口对外提供服务。

3.3. JMX 远程管理

可以通过网络协议访问 JMX API,如 HTTP 协议、SNMP(网络管理协议)协议、RMI 远程调用协议等,JMX 技术默认实现了 RMI 远程调用协议。

受益于资源管理 MBean 的充分解耦,可以轻松的把资源管理功能扩展到其他协议,如通过 HTTP 在网页端进行管理。

4. JMX 的具体使用


在资源管理 MBean 部分已经演示了使用 JMX 获取 JVM 运行信息,那么如果想要自定义一个资源 MBean 呢?

下面通过一个例子,模拟一个内存资源 MBean,最后对它进行远程管理。

4.1. 编写资源管理 MBean

MBean 的编写必须遵守 JMX 的设计规范,MBean 很像一个特殊的 Java Bean,它需要一个接口和一个实现类。MBean 资源接口总是以 MBean 或者 MXBean 结尾实现类则要以接口去掉 MBean 或 MXBean 之后的名字来命名

编写一个内存资源管理 MBean 接口,定义如下:

package com.wdbyte.jmx;

/**

  • @author https://www.wdbyte.com

*/

public interface MyMemoryMBean {

long getTotal();

void setTotal(long total);

long getUsed();

void setUsed(long used);

String doMemoryInfo();

}

然后实现这个接口:

package com.wdbyte.jmx;

/**

  • @author https://www.wdbyte.com

*/

public class MyMemory implements MyMemoryMBean {

private long total;

private long used;

@Override

public long getTotal() {

return total;

}

@Override

public void setTotal(long total) {

this.total = total;

}

@Override

public long getUsed() {

return used;

}

@Override

public void setUsed(long used) {

this.used = used;

}

@Override

public String doMemoryInfo() {

return String.format(“使用内存: %dMB/%dMB”, used, total);

}

}

这个例子在 MyMemory.java 中只有两个 long 基本类型属性,所以接口是以 MBean 结尾。如果资源实现类中的属性是自定义实体类的引用,那么接口就需要以 MXBean 结尾。

这样就完成了线程数量资源 MBean 的创建,其中 totalused 是资源属性,doMemoryInfo 是资源操作方法。

4.2. 注册资源到 MBean Server

通过上面的 JMX 架构图,我们知道 MBean 资源需要注册到 MBean Server 进行代理才可以暴露给外部进行调用,所以我们想要通过远程管理我们自定义的 MyMemory 资源,需要先进行资源代理。

package com.wdbyte.jmx;

import java.lang.management.ManagementFactory;

import javax.management.InstanceAlreadyExistsException;

import javax.management.MBeanRegistrationException;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
。**

[外链图片转存中…(img-ARcploqp-1715346888081)]

[外链图片转存中…(img-UzLslEOx-1715346888081)]

[外链图片转存中…(img-r7TG8IE5-1715346888082)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值