您的位置:首页 > 其它

JMX 和 管理系统简介(一)

2015-11-03 18:04 183 查看
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个

VMHotSpotDiagnosticMXBean 
垃圾收集系统
GarbageCollectorMXBean
至少 1
内存管理器

MemoryManagerMXBean

1个或多个

内存
MemoryMXBean
1个
内存资源
MemoryPoolMXBean
1个
操作系统
OperatingSystemMXBean
1个
logging
PlatformLoggingMXBean

1个

运行时系统
RuntimeMXBean
1个
系统资源压力SystemResourcePressureMXBean
线程ThreadMXBean1个
具体的每个接口实现了什么功能,可以看源码,其实看接口里面方法的定义就可以明白大概的意思。

        java.lang.management包中的mxbean提供了基本的功能,在sum.com.management中对某些功能有所增强,当然我们也可以根据JMX规范提供自己的MXBean。通过如上的这些接口,我们可以获得运行的JVM很详细的信息,从运行JVM、操作系统,到内存、GC和线程,缓冲池,日志,系统压力都可以通过这些标准的接口获取到,来对系统进行全方位的监控。这些接口描述的主要是JVM的总体性的信息,而无法提供更多的细节。如果要了解更多JVM内部信息,可以使用JPDA。JPDA(Java
Platform Debugger Architecture)提供了JVM内部的访问接口,让我们可以方便地了解JVM内部的状态,可以在此基础上构建调试、性能剖析的平台。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JMX管理系统 MXBean