详解 java.lang.management 包

这个包提供了用于监控和管理Java虚拟机的管理接口,以及Java运行时中的其他组件。

一、接口概述

接口名称 描述
BufferPoolMXBean 缓冲池的管理接口,例如:直接映射缓冲池。
ClassLoadingMXBean Java虚拟机的类加载系统的管理接口。
CompilationMXBean Java虚拟机的编译系统的管理接口。
GarbageCollectorMXBean Java虚拟机的垃圾收集的管理接口。
MemoryManagerMXBean 内存管理器的管理接口。
MemoryMXBean Java虚拟机的存储系统的管理接口。
MemoryPoolMXBean 内存池的管理接口。
OperatingSystemMXBean 正在运行Java虚拟机的操作系统的管理接口。
PlatformLoggingMXBean 日志工具的管理接口。
PlatformManagedObject 受平台管理的对象就是JMX的MXBean,用于监控和管理Java平台中的组件。
RuntimeMXBean Java虚拟机的运行时系统的管理接口。
ThreadMXBean Java虚拟机的线程系统的管理接口。

二、类概述

类名称 描述
LockInfo 锁的相关信息。
ManagementFactory ManagementFactory类是一个工厂类,用于获取由Java平台管理的bean。
ManagementPermission 当一段代码通过SecurityManager运行,并且调用在Java平台的管理接口中定义的方法时,SecurityManager便会检查这个对象所代表的许可。
MemoryNotificationInfo 内存通知相关的信息。
MemoryUsage MemoryUsage对象表示内存使用状态的快照。
MonitorInfo 对象监控器锁的相关信息。
ThreadInfo 线程信息。

三、枚举概述

枚举名称 描述
MemoryType 内存池的类型。

四、java.lang.management包详述

这个包提供了用于监控和管理Java虚拟机的管理接口,以及Java运行时中的其他组件。它可以对正在运行的Java虚拟机进行本地和远程的监控和管理。

1. Java平台的MXBean

Java平台的MXBean是一种受管理的bean,它遵循JMX的仪表技术规范,并且仅会使用一组基本的数据类型。Java平台的每个MXBean都是一个PlatformManagedObject对象,具有唯一的名称。

2. ManagementFactory

ManagementFactory类是Java平台的管理工厂类。这个类提供了一组静态的工厂方法,可用于获取Java平台的MXBan,这样便使得应用程序能够直接访问MXBean。

getPlatformMBeanServer方法能够访问一个Java平台的MBeanServer。当首次调用这个方法时,它会创建Java平台的MBeanServer,并且会注册所有的MXBean,包括Java平台的MXBean。Java平台的每个MXBean都会通过一个唯一的名称进行注册,这个名称是由管理接口的规范所定义的。这个MBeanServer可以在相同的Java虚拟机中运行的多个不同的受管理组件之间共享。

3. 互用性

管理应用程序和运行Java虚拟机的平台的MBeanServer能够相互操作,而不需要Java平台的MXBean接口所使用的类。在JMX的连接器服务端和连接器客户端之间传输的数据类型是JMX的开放类型,这样便使得多个版本之间可以相互操作。当通过MBeanServer接口访问时,MXBean接口使用的一种数据类型会映射至一种开放类型。请参考MXBean规范的详细信息。

4. 访问MXBean的方法

应用程序可以通过下面的方式监控Java虚拟机的性能和运行时环境:

(1) 直接访问MXBean接口
  • 获取正在运行的Java虚拟机的本地MXBean实例

    1. RuntimeMXBean mxbean = ManagementFactory.getRuntimeMXBean();
    2. // 获取标准属性“VmVendor”
    3. String vendor = mxbean.getVmVendor();

    或者,调用getPlatformMXBean或getPlatformMXBeans方法:

    1. RuntimeMXBean mxbean = ManagementFactory.getPlatformMXBean(RuntimeMXBean.class);
    2. // 获取标准属性“VmVendor”
    3. String vendor = mxbean.getVmVendor();
  • 构造MXBean代理实例,将方法调用转发至给定的MBeanServer:

    1. MBeanServerConnection mbs;
    2. // 连接至一个正在运行的JVM(或自身),然后获取已经注册过JVM MXBean的MBeanServerConnection
    3. ...
    4. // 为RuntimeMXBean接口获取MBean代理
    5. RuntimeMXBean proxy =
    6. ManagementFactory.getPlatformMXBean(mbs,
    7. RuntimeMXBean.class);
    8. // 获取标准属性“VmVendor”
    9. String vendor = proxy.getVmVendor();

    通常,会通过代理访问远程Java虚拟机的MXBean。可以使用另一种方法创建MXBean代理:

    1. RuntimeMXBean proxy =
    2. ManagementFactory.newPlatformMXBeanProxy(mbs,
    3. ManagementFactory.RUNTIME_MXBEAN_NAME,
    4. RuntimeMXBean.class);
(2) 通过MBeanServer间接访问MXBean接口

应用程序可以通过Java平台的MBeanServer访问本地的MXBean,或者通过专用的MBeanServerConnection访问远程的MXBean。MXBean的属性和操作都只会使用JMX的开放类型,包括基本数据类型、CompositeData类型和TabularData类型。

  1. MBeanServerConnection mbs;
  2. // 连接至一个正在运行的JVM(或自身),然后获取已经注册过JVM MXBean的MBeanServerConnection
  3. ...
  4. try {
  5. // 假设RuntimeMXBean已经在mbs中注册过
  6. ObjectName oname = new ObjectName(ManagementFactory.RUNTIME_MXBEAN_NAME);
  7. // 获取标准属性“VmVendor”
  8. String vendor = (String) mbs.getAttribute(oname, "VmVendor");
  9. } catch (....) {
  10. // 捕获ObjectName构造器和MBeanServer.getAttribute方法抛出的异常
  11. ...
  12. }

5. Java平台扩展

通过定义平台相关的接口,Java虚拟机的具体实现就可以向管理接口添加自己的平台扩展,这样能够扩展标准管理接口的功能,使其包含平台专用的性能度量和管理操作。ManagementFactory类中的静态工厂方法会返回具有平台扩展功能的MXBean。

建议在命名平台专用的属性时,使用供应商专用的前缀(例如,使用供应商的名称作为前缀)。这样便能避免未来对标准管理接口进行扩展时,新增的属性名称和平台扩展产生冲突。如果未来对标准管理接口进行扩展时,为某个管理接口定义了一个新的属性,并且这个属性的名称恰巧和某个供应商专用的属性名称相同,那么就必须修改访问这个供应商特定属性的应用程序,这样才能解决版本和兼容性的问题。

下面举个例子,演示如何通过平台扩展访问某个属性:

(1) 直接访问Oracle专用的MXBean接口
  1. List<com.sun.management.GarbageCollectorMXBean> mxbeans =
  2. ManagementFactory.getPlatformMXBeans(com.sun.management.GarbageCollectorMXBean.class);
  3. for (com.sun.management.GarbageCollectorMXBean gc : mxbeans) {
  4. // 获取标准属性“CollectionCount”
  5. String count = mxbean.getCollectionCount();
  6. // 获取平台专用属性“LastGcInfo”
  7. GcInfo gcinfo = gc.getLastGcInfo();
  8. ...
  9. }
(2) 通过MBeanServer和代理访问Oracle专用的MXBean接口
  1. MBeanServerConnection mbs;
  2. // 连接至一个正在运行的JVM(或自身),然后获取已经注册过JVM MXBean的MBeanServerConnection
  3. ...
  4. List<com.sun.management.GarbageCollectorMXBean> mxbeans =
  5. ManagementFactory.getPlatformMXBeans(mbs, com.sun.management.GarbageCollectorMXBean.class);
  6. for (com.sun.management.GarbageCollectorMXBean gc : mxbeans) {
  7. // 获取标准属性“CollectionCount”
  8. String count = mxbean.getCollectionCount();
  9. // 获取平台专用属性“LastGcInfo”
  10. GcInfo gcinfo = gc.getLastGcInfo();
  11. ...
  12. }

除非另有说明,向这个包中的任意类的构造器或方法传递一个null参数,都将会抛出一个NullPointerException(空指针异常)。

java.lang.management包的API是线程安全的。