使用 MBeanServer 接口进行间接访问
平台 MBeanServer 接口使用 MXBeanServerConnection,使您能够连接到远程 JVM 并访问运行在这些平台上的 MXBean。您可以使用 ManagementFactory 类的 getPlatformMBeanServer 方法访问平台 MBean 服务器。清单 2 演示了如何获得运行在远程 JVM 上的 RuntimeMXBean 并获得 VmVendor 属性的值:
清单 2. 间接访问 MXBean
MBeanServerConnection serverConn; try { //connect to a remote VM using JMX RMI JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://"); JMXConnector jmxConnector = JMXConnectorFactory.connect(url); serverConn = jmxConnector.getMBeanServerConnection(); ObjectName objName = new ObjectName(ManagementFactory.RUNTIME_MXBEAN_NAME); // Get standard attribute "VmVendor" String vendor = (String) serverConn.getAttribute(objName, "VmVendor"); } catch (...) { } |
有关 MXBeans 和 java.lang.management API 的更详细信息,请参阅 参考资料 。
Java SE 6 中的 API 增强
Java SE 5 引入了 java.util.concurrent.locks 包,它为锁定和等待条件提供了一种框架。这种框架有别于 Java 的内置同步支持并允许更加灵活地使用锁。
Java SE 6 为 java.lang.management 包的 java.util.concurrent.locks 添加了支持。这包括可提供锁信息的新类以及对 ThreadInfo、ThreadMXBean 和 OperatingSystemMXBean 接口的增强。
Java SE 6 引入了两个新类:
LockInfo 包含有关锁的信息。
MonitorInfo 扩展了 LockInfo 并包含有关对象监视锁的信息。
ThreadInfo 类利用了这些新的对象以及引入的三种新方法:
getLockInfo() 返回 LockInfo 对象,给定线程将被阻塞以等待该对象。
getLockedMonitors() 返回当前被给定线程锁定的 MonitorInfo 对象。
getLockedSynchronizers() 返回 LockInfo 对象,提供当前由给定线程锁定的可拥有的同步程序。
在 Java SE 5 中,ThreadMXBean.getThreadInfo 方法只报告线程正在等待获取的对象监视器或是被阻塞的监视器。Java SE 6 对这些方法进行了增强,从而可以报告线程正在等待获取的 AbstractOwnableSynchronizer。
4 个新的方法被添加到 ThreadMXBean 接口中:
isObjectMonitorUsageSupported() 将测试虚拟机是否支持对对象监视器的使用情况进行监视。
isSynchronizerUsageSupported() 测试虚拟机是否对可拥有的同步程序使用情况进行监视。
findDeadlockedThreads() 返回处于死锁状态的线程的 ID 数组。死锁线程被阻塞,防止进入对象监视器或同步程序。
dumpAllThreads() 为所有活动线程返回堆栈跟踪和同步信息。
最后,OperatingSystemMXBean 接口将进行更新,以包括 getSystemLoadAverage() 方法,它可以返回前一分钟的系统负载平均值。
除了提供编程支持以外,Java SE 6 还包括了一些诊断和故障排除工具,可用来检测问题并监视 JVM 资源使用情况。接下来两节将介绍并演示其中几个可用的诊断工具。
Java 监视和管理控制台(JConsole)
Java SE 6 提供了对 JConsole 的正式支持,这是 Java 5 SE 中引入的监视和管理控制台。JConsole 使您能够在运行时监视各种 JVM 资源统计信息。这种特性特别适用于检测死锁、锁竞争、内存泄漏和循环线程。它可以连接到一个本地或远程 JVM 并可用来进行监视:
线程状态(包括相关的锁)
内存使用情况
垃圾收集
运行时信息
JVM 信息
以下小节将介绍 Java SE 6 对 JConsole 做出的增强。有关如何启动和使用 JConsole 的更多信息,请参阅 参考资料。