Package java.lang.management
平台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();
或通过调用
getPlatformMXBean
或getPlatformMXBeans
方法: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开放类型,其中包括基本数据类型、CompositeData
和TabularData
在OpenType
中定义。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
- 参见:
-
ClassDescription缓冲池的管理接口,例如
direct
或mapped
缓冲区池。Java虚拟机的类加载系统的管理接口。Java虚拟机的编译系统的管理接口。Java虚拟机的垃圾收集的管理接口。有关锁的信息。ManagementFactory
类是用于获取Java平台托管bean的工厂类。当使用SecurityManager运行代码调用Java平台管理接口中定义的方法时,SecurityManager将检查的权限。内存管理器的管理接口。Java虚拟机的内存系统的管理接口。内存通知的信息。内存池的管理接口。内存池
的类型。MemoryUsage
对象表示内存使用的快照。对象监视器锁的信息。Java虚拟机正在运行的操作系统的管理接口。日志设施的管理接口。平台托管对象是用于监视和管理Java平台组件的JMX MXBean。Java虚拟机的运行时系统的管理接口。线程信息。Java虚拟机的线程系统的管理接口。