JMX 是管理系统和资源之间的一个接口,它定义了管理系统和资源之间交互的标准。javax.management.MBeanServer实现了 Agent 的功能,以标准的方式给出了管理系统访问 JMX 框架的接口。而从类库的层次上看,JMX 包括了核心类库 java.lang.management和 javax.management包。java.lang.management包提供了基本的 VM 监控功能,而 javax.management包则向用户提供了扩展功能。
架构图:
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。 JMX的优点在于:
- 可以非常容易的使应用程序具有被管理的功能
- 提供具有高度伸缩性的架构,每个JMX Agent服务可以很容易的放入到Agent中,每个JMX的实现都提供几个核心的Agent服务,你也可以自己编写服务,服务可以很容易的部署,取消部署。
- 主要提供接口,允许有不同的实现。
从JAVA 5开始,JDK就提供非常有名的java.lang.management 包,包里提供了许多MXBean的接口类,开发者可以很方便的获取到JVM的内存、GC、线程、锁、class、甚至操作系统层面的各种信息。
首先,简要介绍下JMX(Java Management Extensions),即JAVA管理扩展,用来监视和管理JVM以及其运行的操作系统。目前java平台主要提供了下图所示的12个MXBean。
java.lang.management.BufferPoolMXBean : 管理缓冲池的接口。例如:java.nio.ByteBuffer#allocateDirect direct或者java.nio.MappedByteBuffer mapped的缓冲池。
java.lang.management.ClassLoadingMXBean : 管理JVM类加载系统的接口。提供JVM的JIT(Just In Time)编译器(将bytecode编译成native code)的信息。Java 虚拟机具有此接口的实现类的单个实例。实现此接口的实例是一个 MXBean,可以通过调用 ManagementFactory.getClassLoadingMXBean() 方法或从ManagementFactory.getPlatformMBeanServer方法获得。
在 MBeanServer 中唯一标识类加载系统的 MXBean 的 ObjectName 为:
java.lang:type=ClassLoading
java.lang.management.CompilationMXBean:管理JVM编译系统的接口。 Java 虚拟机具有此接口的实现类的单个实例。实现此接口的实例是一个 MXBean,可以通过调用 ManagementFactory.getClassLoadingMXBean() 方法或从ManagementFactory.getPlatformMBeanServer方法获得。
在 MBeanServer 中唯一标识编译系统的 MXBean 的 ObjectName 为:
java.lang:type=Compilation
com.sun.management.HotSpotDiagnosticMXBean : 可以用于获取VM信息。它支持dumpHeap(String outputFile, boolean live)操作,让Java程序能直接指定路径和是否只要活对象进行heap dump。
在 MBeanServer 中唯一标识编译系统的 MXBean 的 ObjectName 为:
com.sun.management:type=HotSpotDiagnostic
java.lang.management.MemoryManagerMXBean : 内存管理器的管理接口。内存管理器管理 Java 虚拟机的一个或多个内存池。
Java 虚拟机具有一个或多个内存管理器。实现此接口的实例是 MXBean,可以通过调用 ManagementFactory.getMemoryManagerMXBeans() 方法或从平台ManagementFactory.getPlatformMBeanServer方法获得。
在 MBeanServer 内唯一标识内存管理器的 MXBean 的 ObjectName 为:
java.lang:type=MemoryManager,name=manager's name
java.lang.management.MemoryMXBean:JVM内存系统的管理接口。Java 虚拟机具有此接口的实现类的单一实例。实现此接口的实例是一个 MXBean,可以通过调用 ManagementFactory.getMemoryMXBean() 方法或从ManagementFactory.getMemoryManagerMXBeans()方法获得。
在 MBeanServer 中唯一标识内存系统的 MXBean 的 ObjectName 为:
java.lang:type=Memory
java.lang.management.MemoryPoolMXBean :内存池的管理接口。内存池表示由JVM管理的内存资源,由一个或多个内存管理器对内存池进行管理。JVM具有此接口的实现类的一个或多个实例。实现此接口的实例是 MXBean,可以通过调用 ManagementFactory.getMemoryPoolMXBeans() 方法或从ManagementFactory.getMemoryManagerMXBeans()方法获得。
在 MBeanServer 中惟一标识内存池的 MXBean 的 ObjectName 为:
java.lang:type=MemoryPool,name=pool's name
java.lang.management.OperatingSystemMXBean :用于操作系统的管理接口,JVM在此操作系统上运行。JVM具有此接口的实现类的单一实例。实现此接口的实例是一个 MXBean,可以通过调用 ManagementFactory.getOperatingSystemMXBean() 方法或从ManagementFactory.getMemoryManagerMXBeans()方法获得。
用于在 MBeanServer 中唯一标识操作系统的 MXBean 的 ObjectName 为:
java.lang:type=OperatingSystem
java.lang.management.PlatformLoggingMXBean :java.util.logging的管理接口,JVM在此操作系统上运行。JVM具有此接口的实现类的单一实例。实现此接口的实例是一个 MXBean,可以通过调用 ManagementFactory.getPlatformMXBean() 方法或从ManagementFactory.getPlatformMBeanServer()方法获得。
用于在 MBeanServer 中唯一标识操作系统的 MXBean 的 ObjectName 为:
java.util.logging:type=Logging
java.lang.management.RuntimeMXBean: JVM的运行时系统的管理接口。JVM具有此接口的实现类的单一实例。实现此接口的实例是一个MXBean,它可以通过调用 ManagementFactory.getRuntimeMXBean() 方法或从ManagementFactory.getPlatformMBeanServer()方法获得。
在 MBeanServer 中唯一标识运行时系统的 MXBean 的 ObjectName 为:
java.lang:type=Runtime
jdk.management.cmm.SystemResourcePressureMXBean:从 JDK 8u40 开始,在 JDK 中增加了“内存压力”的概念。内存压力属性代表系统上的总内存使用量 (RAM)。内存压力越高,系统越接近于用完内存。这是实验性功能,尚不允许商用。为了应对内存压力增大,JDK 将尝试减少其内存使用量。主要通过减少 Java 堆大小来实现这一点。JDK 为减少内存使用量而采取的操作可能会导致性能降低。这是特意的选择。应用程序通过 JMX MXBean 提供压力级别,范围从 0(无压力)到 10(几乎用尽内存)。要启用此功能,应注册 jdk.management.cmm.SystemResourcePressureMXBean。然后,使用 "MemoryPressure" 属性设置内存压力。
此外还提供了一个新的命令行标记 -XX:MemoryRestriction,它采用参数 "none"、"low"、"medium" 或 "high" 之一。此标记将在 JDK 中设置初始压力,对于未注册 MXBean 的情况,此标记同样起作用。协作内存管理需要 G1 GC (-XX:+UseG1GC)。此功能与 -XX:+ExplicitGCInvokesConcurrent 标记不兼容。
java.lang.management.ThreadMXBean: Java 虚拟机线程系统的管理接口。 JVM具有此接口的实现类的单一实例。实现此接口的实例是一个 MXBean,可以通过调用 ManagementFactory.getThreadMXBean() 方法或从ManagementFactory.getPlatformMBeanServer()方法获得它。
在 MBeanServer 内唯一标识线程系统的 MXBean 的 ObjectName 是:
java.lang:type=Threading
平台资源 | 对应的 MXBean | 可使用的数量 |
---|---|---|
缓冲池 |
BufferPoolMXBean
|
1个或多个
|
类装入系统
|
ClassLoadingMXBean
|
1个
|
编译系统 |
CompilationMXBean
|
1个
|
VM | HotSpotDiagnosticMXBean | |
垃圾收集系统 | GarbageCollectorMXBean | 至少 1 |
内存管理器
|
MemoryManagerMXBean
|
1个或多个
|
内存 | MemoryMXBean | 1个 |
内存资源 | MemoryPoolMXBean | 1个 |
操作系统 | OperatingSystemMXBean | 1个 |
logging
|
PlatformLoggingMXBean
|
1个
|
运行时系统 | RuntimeMXBean | 1个 |
系统资源压力 | SystemResourcePressureMXBean | |
线程 | ThreadMXBean | 1个 |
具体的每个接口实现了什么功能,可以看源码,其实看接口里面方法的定义就可以明白大概的意思。
java.lang.management包中的mxbean提供了基本的功能,在sum.com.management中对某些功能有所增强,当然我们也可以根据JMX规范提供自己的MXBean。通过如上的这些接口,我们可以获得运行的JVM很详细的信息,从运行JVM、操作系统,到内存、GC和线程,缓冲池,日志,系统压力都可以通过这些标准的接口获取到,来对系统进行全方位的监控。这些接口描述的主要是JVM的总体性的信息,而无法提供更多的细节。如果要了解更多JVM内部信息,可以使用JPDA。JPDA(Java Platform Debugger Architecture)提供了JVM内部的访问接口,让我们可以方便地了解JVM内部的状态,可以在此基础上构建调试、性能剖析的平台。