使用 JMX 监控和管理 Java 程序(一)

简介: 使用 JMX 监控和管理 Java 程序

此篇文章介绍 Java JMX 技术的相关概念和具体的使用方式。

微信图片_20220414180314.png

当前文章属于Java 性能分析优化系列文章,点击话题可以查看所有文章。

1. JMX 是什么?

Java Management Extensions(JMX)技术是 Java SE 平台的标准功能,提供了一种简单的、标准的监控和管理资源的方式,对于如何定义一个资源给出了明确的结构和设计模式,主要用于监控和管理 Java 应用程序运行状态、设备和资源信息、Java 虚拟机运行情况等信息。JMX 是可以动态的,所以也可以在资源创建、安装、实现时进行动态监控和管理,JDK 自带的 jconsole 就是使用 JMX 技术实现的监控工具。

使用 JMX 技术时,通过定义一个被称为 MBeanMXBean 的 Java 对象来表示要管理指定的资源,然后可以把资源信息注册到 MBean Server 对外提供服务。MBean Server 充当了对外提供服务和对内管理 MBean 资源的代理功能,如此优雅的设计让 MBean 资源管理和 MBean Server 代理完全独立开,使之可以自由的控制 MBean 资源信息。

JMX 不仅仅用于本地管理,JMX Remote API 为 JMX 添加了远程功能,使之可以通过网络远程监视和管理应用程序。

2. 为什么使用 JMX 技术?

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)组成 ,下面的图片来自维基百科,很好的展示了三个模块之间的关系。

微信图片_20220414180820.png图片来自维基百科

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<GarbageCollectorMXBean> 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 在网页端进行管理。

相关文章
|
1月前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
112 38
|
1月前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
68 1
|
24天前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
37 0
|
1月前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
20 2
|
1月前
|
Prometheus 监控 Cloud Native
JAVA线程池监控以及动态调整线程池
【10月更文挑战第22天】在 Java 中,线程池的监控和动态调整是非常重要的,它可以帮助我们更好地管理系统资源,提高应用的性能和稳定性。
97 4
|
1月前
|
Prometheus 监控 Cloud Native
在 Java 中,如何使用线程池监控以及动态调整线程池?
【10月更文挑战第22天】线程池的监控和动态调整是一项重要的任务,需要我们结合具体的应用场景和需求,选择合适的方法和策略,以确保线程池始终处于最优状态,提高系统的性能和稳定性。
256 2
|
2月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
156 2
|
2月前
|
安全 Java Linux
java程序设置开机自启
java程序设置开机自启
157 1
|
监控 网络协议 Java
使用 JMX 监控和管理 Java 程序(二)
使用 JMX 监控和管理 Java 程序(二)
502 0
使用 JMX 监控和管理 Java 程序(二)
|
8天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
38 6