Module java.management

Package java.lang.management


package java.lang.management
提供了用于监视和管理Java虚拟机和Java运行时中其他组件的管理接口。它允许对正在运行的Java虚拟机进行本地和远程监视和管理。

平台MXBean

平台MXBean是符合JMX仪器规范的托管bean,并且仅使用一组基本数据类型。每个平台MXBean都是一个具有唯一PlatformManagedObject名称

ManagementFactory

ManagementFactory类是Java平台的管理工厂类。该类提供了一组静态工厂方法,以获取Java平台的MXBeans,从而允许应用程序直接访问MXBeans。

可以使用getPlatformMBeanServer方法访问平台MBeanServer。在第一次调用此方法时,它会创建平台MBeanServer并注册所有平台MXBeans,包括平台MXBeans。每个平台MXBean都使用管理接口规范中定义的唯一名称进行注册。这是一个可以由同一Java虚拟机中运行的不同托管组件共享的单个MBeanServer。

互操作性

管理应用程序和正在运行的虚拟机的平台MBeanServer可以在不需要平台MXBean接口使用的情况下进行互操作。在JMX连接器服务器和连接器客户端之间传输的数据类型是JMX 开放类型,这允许跨版本进行互操作。当通过MBeanServer接口访问MXBean接口时,MXBean接口使用的数据类型会被映射为开放类型。有关详细信息,请参阅MXBean规范。

访问MXBeans的方式

应用程序可以通过以下方式监视Java虚拟机和运行时的仪器:

1. 直接访问MXBean接口

  • 在正在运行的Java虚拟机中本地获取MXBean实例:
       RuntimeMXBean mxbean = ManagementFactory.getRuntimeMXBean();
    
       // 获取标准属性"VmVendor"
       String vendor = mxbean.getVmVendor();
    

    或通过调用getPlatformMXBeangetPlatformMXBeans方法:

       RuntimeMXBean mxbean = ManagementFactory.getPlatformMXBean(RuntimeMXBean.class);
    
       // 获取标准属性"VmVendor"
       String vendor = mxbean.getVmVendor();
    
  • 构造一个MXBean代理实例,将方法调用转发给给定的MBeanServer:
       MBeanServerConnection mbs;
    
       // 连接到正在运行的JVM(或自身)并获取已在其中注册JVM MBeans的MBeanServerConnection
       ...
    
       // 获取RuntimeMXBean接口的MBean代理
       RuntimeMXBean proxy =
           ManagementFactory.getPlatformMXBean(mbs,
                                               RuntimeMXBean.class);
       // 获取标准属性"VmVendor"
       String vendor = proxy.getVmVendor();
    

    代理通常用于访问远程Java虚拟机中的MXBean。创建MXBean代理的另一种方法是:

       RuntimeMXBean proxy =
           ManagementFactory.newPlatformMXBeanProxy(mbs,
                                                    ManagementFactory.RUNTIME_MXBEAN_NAME,
                                                    RuntimeMXBean.class);
    

2. 通过MBeanServer间接访问MXBean接口

  • 通过平台MBeanServer访问本地MXBeans或特定的MBeanServerConnection以远程访问MXBeans。MXBean的属性和操作仅使用JMX开放类型,其中包括基本数据类型、CompositeDataTabularDataOpenType中定义。
       MBeanServerConnection mbs;
    
       // 连接到正在运行的JVM(或自身)并获取已在其中注册JVM MXBeans的MBeanServerConnection
       ...
    
       try {
           // 假设RuntimeMXBean已在mbs中注册
           ObjectName oname = new ObjectName(ManagementFactory.RUNTIME_MXBEAN_NAME);
    
           // 获取标准属性"VmVendor"
           String vendor = (String) mbs.getAttribute(oname, "VmVendor");
       } catch (....) {
           // 捕获ObjectName构造函数和MBeanServer.getAttribute方法抛出的异常
           ...
       }
    

平台扩展

Java虚拟机实现可以通过定义扩展标准管理接口的平台相关接口来将其平台扩展添加到管理接口中,以包括特定于平台的指标和管理操作。ManagementFactory类中的静态工厂方法将返回带有平台扩展的MXBeans。

建议使用供应商特定前缀(例如供应商名称)为平台特定属性命名,以避免将来扩展标准管理接口和平台扩展之间的属性名称冲突。如果将来扩展标准管理接口为管理接口定义了新属性,并且属性名称恰好与某些供应商特定属性的名称相同,那么访问该供应商特定属性的应用程序将不得不修改以应对版本和兼容性问题。

以下是一个示例,展示如何访问平台扩展中的属性:

1) 直接访问Oracle特定的MXBean接口

   List<com.sun.management.GarbageCollectorMXBean> mxbeans =
       ManagementFactory.getPlatformMXBeans(com.sun.management.GarbageCollectorMXBean.class);

   for (com.sun.management.GarbageCollectorMXBean gc : mxbeans) {
       // 获取标准属性"CollectionCount"
       String count = mxbean.getCollectionCount();

       // 获取平台特定属性"LastGcInfo"
       GcInfo gcinfo = gc.getLastGcInfo();
       ...
   }

2) 通过MBeanServer通过代理访问Oracle特定的MXBean接口

   MBeanServerConnection mbs;

   // 连接到正在运行的JVM(或自身)并获取已在其中注册JVM MXBeans的MBeanServerConnection
   ...

   List<com.sun.management.GarbageCollectorMXBean> mxbeans =
       ManagementFactory.getPlatformMXBeans(mbs, com.sun.management.GarbageCollectorMXBean.class);

   for (com.sun.management.GarbageCollectorMXBean gc : mxbeans) {
       // 获取标准属性"CollectionCount"
       String count = mxbean.getCollectionCount();

       // 获取平台特定属性"LastGcInfo"
       GcInfo gcinfo = gc.getLastGcInfo();
       ...
   }

除非另有说明,在此包中的任何类或接口的构造函数或方法中将null参数传递将导致抛出NullPointerException

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

自从:
1.5
参见: