A. 使用 JMX 监控和管理 java 程序
主题 JMX
本文讲解Java JMX技术的相关概念和实际应用。
本文章属于Java性能分析优化系列文章,点击话题可查看所有文章。
1. JMX是什么?
Java Management Extensions(JMX)是Java SE平台的标准功能,提供了一种简单且标准化的资源监控和管理方式。它定义了资源的结构和模式,主要用于监控和管理Java应用程序运行状态、设备和资源信息以及Java虚拟机运行情况。JMX的动态性使其能够在资源创建、安装、实现时进行动态监控和管理。JDK自带的jconsole就是基于JMX技术的监控工具。
在使用JMX技术时,通过定义一个MBean(或MXBean)的Java对象来表示要管理的资源,并将其注册到MBean Server,对外提供服务。MBean Server作为代理,负责对外提供服务和对内管理MBean资源,实现了资源管理和MBean Server的完全独立控制。
JMX不仅适用于本地管理,还通过JMX Remote API扩展了远程功能,使其能够通过网络远程监视和管理应用程序。
2. 为何使用JMX技术?
JMX技术为Java开发者提供了一种简单、灵活且标准化的资源监控方式,得益于其相对独立的架构设计,JMX能轻松集成到各种监控系统中。
JMX的具体优点包括:
3. JMX的技术架构
JMX架构由资源管理(MBean/MXBean)、资源代理(MBean Server)和远程管理(Remote API)组成。下图展示了三个模块之间的关系。
3.1. 资源管理MBean
资源管理是架构中的资源探测层(Probe Level),在JMX中,使用MBean或MXBean表示资源,访问和管理资源都通过MBean,MBean包含资源的属性和操作方法。
JMX已经为JVM提供了多维度资源检测,可以轻松启动JMX代理访问内置的JVM资源检测,从而实现远程监控和管理JVM。
以下是JMX对JVM资源检测类的示例代码。
运行后得到结果如下:
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远程管理
可以通过HTTP协议、SNMP协议、RMI远程调用协议等网络协议访问JMX API,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接口如下:
然后实现这个接口:
这样就完成了线程数量资源MBean的创建,其中total和used是资源属性,doMemoryInfo是资源操作方法。
4.2. 注册资源到MBean Server
通过上述JMX架构图,我们知道MBean资源需要注册到MBean Server进行代理才能暴露给外部调用。为了通过远程管理自定义的MyMemory资源,需要先进行资源代理。
启动后可以看到控制台每三秒打印我们自定义的内存信息。
不加任何JVM参数启动Java程序,JMX只能在当前机器访问,若要通过网络实现真正的远程访问,需要指定当前机器IP和开放端口。
4.3. 远程管理jconsole
jconsole是Java自带的基于JMX技术的监控管理工具,若已配置JDK环境变量,可通过控制台运行jconsole命令启动。
启动jconsole后列出当前机器上的Java进程,选择要监控的Java进程进行监控,连接后提示不安全的协议,原因是Java程序默认启动不配置HTTPS协议。
连接后可以看到多维度的JVM监控信息,这些信息通过读取JVM资源MBean信息获得。
在下面的页面展示了线程信息,注意最下面的线程信息,可以看到RMI TCP线程,这证明了JMX默认通过RMI协议进行远程管理。
在MBean页面可以浏览所有可管理的MBean信息,也可以看到我们自定义的com.wdbyte.jmx中的内存信息,甚至可以直接修改其中的used变量。
修改后控制台日志立即发生变化,已修改成功。
在操作中可以调用doMemoryInfo方法,调用后可以看到返回值中使用内存已从启动时的20MB更新为30MB。
以上代码示例存放在github.com/niumoo/JavaN...
当前系列:
---- E ND ----
分享一波面试资料,请点击链接加入群聊【马士兵官方java编程学】:
B. 必须要会的JVM性能监测工具(JVisualVM)
JVisualVM是Java开发者必须要掌握的JVM性能监测工具,其主要特点和功能如下:
监控垃圾收集过程:JVisualVM能够实时监控Java虚拟机的垃圾收集活动,帮助开发者了解内存管理情况。
包含JDK自带命令功能:它几乎涵盖了所有JDK自带命令的功能,无需复杂配置即可使用,为开发者提供了极大的便利。
易于获取和启动:从JDK1.6版本开始,JVisualVM通常位于JDK安装目录的bin文件夹中。只需双击或通过命令行输入jvisualvm即可启动。
本地和远程监控能力:JVisualVM不仅可以监控本地Java进程,如IDEA等IDE,还可以通过配置JVM参数来监控远程服务器上的Java进程。这包括CPU、内存、线程状态和堆内存映像等详细信息。
线程和内存分析:通过分析线程状态和执行时间,以及内存使用情况,JVisualVM可以帮助开发者识别性能瓶颈和内存泄漏等问题。
导出内存映像和线程堆栈信息:JVisualVM支持导出内存映像和线程堆栈信息,这对于后续的性能分析和问题诊断至关重要。
Visual GC插件增强功能:通过安装Visual GC插件,JVisualVM的性能分析功能可以得到进一步增强,提供更直观的GC活动视图。
堆mp文件分析:通过堆mp文件,JVisualVM可以深入检查内存占用和对象大小,这对于解决生产环境中的内存问题非常有帮助。
综上所述,JVisualVM以其强大的功能和易用性,成为Java开发者在进行JVM性能监控和问题诊断时必不可少的工具。
C. Java开发者最有用的监控工具
Java 开发者最有用的监控工具如下:
Datadog
Datadog 是 SaaS 监测工具,针对 DevOps 团队,从 app 或者其他各种工具获取数据并提供数据可视化功能。它把从基础设备和软件采集的数据统一处理并存储。允许创建仪表盘和搜索访问提供的数据。
Ruxit
它由 Dynatrace 开发,Ruxit 是一个应用性能监控工具,它作用于 SaaS 模型。它通过 SaaS 提供不同的 APM 体验,并工作在高扩展性环境中。
Takipi
Takipi 告 知生产环境下的代码在什么时候、因什么原因而终止执行。它对所有错误进行检测,同时会给出出现错误时代码的位置和变量的状态。Takipi 是以 Java 代理的身份运行的,与任何日志文件无关,这样就会减少小于 %3 的 CPU 和 IO 运行花费。