Java SE 6深入关注性能,提供了用于管理和监视应用程序以及诊断常见问题的扩展工具。 改进包括:
监控和管理API增强 官方支持名为JConsole的改进的图形监视工具 Java虚拟机(JVM)的增强工具本文概述了Java SE平台中监视和管理的基础,并提供了有关最新版本中性能监视和管理增强的详细信息。 它还描述了Java SE 6平台中可用的诊断和故障排除工具。
要从本文中受益,您应该对Java SE先前版本中引入的监视和管理功能有深刻的了解。 请参阅相关主题进行详细的背景资料。
该java.lang.management在Java SE 5个定义了9个MBean的所谓平台的MBean或MXBean的推出包(请参阅相关的主题 )。 每个MXBean都封装JVM的单个功能区域。 从Java SE 5开始,JVM包括一个内置的MBean服务器,称为平台MBean服务器 。 MBean驻留在此存储库中,并由该存储库管理。 表1概述了Java平台中的九种MXBean:
任何应用程序都可以通过获取所需bean的实例并调用适当的方法来获取和使用JVM提供的平台MBean。 MXBean可用于监视本地和远程JVM的行为并检索有关它们的信息。
平台MBean提供对信息的访问,例如,已加载的类数,JVM的正常运行时间,消耗的内存量,正在运行的线程数以及有关线程争用的统计信息。
您可以通过以下两种方式之一监视和管理JVM资源:
直接访问MXBean接口 使用MBeanServer接口的间接访问您可以从静态工厂方法检索MXBean实例,该方法使您可以直接访问在本地运行的JVM的MXBean接口。 ManagementFactory类提供用于获取MXBean的静态工厂方法。 清单1中的示例演示了如何使用该工厂检索RuntimeMXBean并获取其标准属性之一的值: VmVendor :
平台MBeanServer接口使用MXBeanServerConnection来允许您连接到远程JVM并访问在那些平台上运行的MXBean。 您可以使用ManagementFactory类的getPlatformMBeanServer方法访问平台MBean服务器。 清单2演示了如何使RuntimeMXBean在远程JVM中运行以及如何获取其VmVendor属性的值:
请参阅相关主题有关MXBeans的和更详细的信息, java.lang.management API。
Java SE 5引入了java.util.concurrent.locks软件包,该软件包提供了锁定和等待条件的框架。 该框架与Java的内置同步支持不同,并允许在使用锁方面具有更大的灵活性。
Java SE 6在java.lang.management包java.util.concurrent.locks添加了对java.util.concurrent.locks支持。 这包括提供有关锁的信息的新类,以及对ThreadInfo , ThreadMXBean和OperatingSystemMXBean接口的增强。
Java SE 6引入了两个新类:
LockInfo包含有关锁的信息。 MonitorInfo延伸LockInfo并包含有关对象监视器锁信息。ThreadInfo类通过引入三个新方法来利用这些新对象:
getLockInfo()返回LockInfo的量,给定的线程被阻塞等待对象。 getLockedMonitors()返回当前由给定线程锁定的MonitorInfo对象。 getLockedSynchronizers()返回getLockedSynchronizers()对象, LockInfo对象表示当前由给定线程锁定的可拥有的同步器。在Java SE 5中, ThreadMXBean.getThreadInfo方法仅报告线程正在等待获取或被阻止进入的对象监视器。 在Java SE 6中,对这些方法进行了增强,以报告线程正在等待获取的AbstractOwnableSynchronizer 。
四个新方法已添加到ThreadMXBean接口:
isObjectMonitorUsageSupported()测试虚拟机是否支持监视对象监视器的使用情况。 isSynchronizerUsageSupported()测试虚拟机是否支持监视可拥有的同步器的使用。 findDeadlockedThreads()返回死锁的线程ID数组。 死锁的线程彼此阻塞,无法进入对象监视器或同步器。 dumpAllThreads()返回所有活动线程的堆栈跟踪和同步信息。最后,对OperatingSystemMXBean接口进行了更新,以包括getSystemLoadAverage()方法,该方法返回过去一分钟的系统平均负载。
除了此编程支持之外,Java SE 6还包括一些诊断和故障排除工具,可用于检测问题和监视JVM资源的使用。 接下来的两个部分描述并演示了一些可用的诊断工具。
Java SE 6包括对JConsole的官方支持,JConsole是Java SE 5中引入的监视和管理控制台。通过JConsole,您可以在运行时监视各种JVM资源统计信息。 它对于检测死锁,锁争用,内存泄漏和循环线程的症状特别有用。 它可以连接到本地或远程JVM,并可以用于监视:
线程状态(包括关联的锁) 内存使用情况 垃圾收集 运行时信息 JVM信息以下小节介绍了Java SE 6中看到的JConsole做出的增强相关主题有关如何启动和使用JConsole的更多信息。
从Java SE 6开始,JConsole实施了新的Attach API。 该API由两个包com.sun.tools.attach和com.sun.tools.attach.spi组成,它们使实现的应用程序可以动态地附加到目标虚拟机,并在该JVM中运行其代理。
过去,您要使用JConsole监视的应用程序需要使用-Dcom.sun.management.jmxremote选项启动; -Dcom.sun.management.jmxremote ,您将无法启动该应用程序。 应用程序不再需要从该选项开始。 对动态附件的支持使JConsole能够监视任何支持Attach API的应用程序。 JConsole启动时,将自动检测到兼容的应用程序。
在Java SE 6中,对JConsole进行了更新,使其外观类似于Windows®操作系统或GNOME桌面,具体取决于它在哪个平台上运行。 本文其余部分显示的屏幕快照是在Windows XP上拍摄的,显示了与以前版本相比已更改的UI功能。
启动并与应用程序关联后,JConsole视图将包含六个选项卡,每个选项卡代表一个不同的JVM资源或一组资源:
总览 记忆 线程数 班级 虚拟机摘要 豆类“概述”选项卡以图形格式显示有关内存使用,线程,类和CPU使用情况的相关信息。 “概述”选项卡在一个页面上显示一组相关信息,该信息以前只能通过在多个选项卡之间切换来获得。 图1显示了示例应用程序的Overview选项卡:
“概述”选项卡显示四个VM资源使用信息图以及一个用于更改您希望查看结果的时间范围的选择列表。 第一个图形“堆内存使用情况”显示了一段时间内已使用的堆内存量(以兆字节为单位)。 该图对于检测内存泄漏很有用。 如果应用程序中存在内存泄漏,则堆内存使用量会随着时间稳定增长。
“线程”图绘制了一段时间内活动线程的数量,“类”图描述了已加载的类的数量。 “ CPU使用率”图表描述了应用程序在其生命周期中各个点使用的CPU百分比。
如图2所示,VM Summary选项卡是Java SE 6发行版的另一个新增功能。 它提供了有关JVM的详细信息,包括总运行时间,线程信息,已加载的类,内存统计信息,垃圾收集和操作系统信息。
MBeans选项卡已得到改进,可以更轻松地访问MBeans的操作和属性。 它显示有关在平台上注册的所有MBean的信息。 可通过此选项卡访问所有平台MBean。 左侧的树结构显示所有当前正在运行的MBean。 选择一个MBean时,其MBeanInfo和描述符显示在右侧的表中,如图3所示:
选择Attributes节点将显示所有MBean的属性,如图4所示的Threading MBean:
请注意,右侧框中显示的属性及其值映射到通过上述java.lang.management包中的ThreadMXBean API可获得的属性值。 您可以通过双击属性值来获取有关列出的属性的其他信息。 只能扩展以粗体显示的属性值。 例如,双击AllThreadIds值将显示所有22个线程的线程ID,如图5所示:
可写属性以蓝色显示,您可以通过单击它们并输入新值来对其进行编辑。 例如,可以从JConsole视图以这种方式编辑图5所示的ThreadContentionMonitoringAvailable属性。
在左侧树结构中选择“操作”节点将显示与该MBean关联的操作。 MBean操作在右侧显示屏中显示为按钮,并且在单击时会调用指定的方法。 图6显示了ThreadMXBean可用的操作:
在Java SE 6中,JConsole包括对HotSpot Diagnostic MBean的支持。 此版本中引入了此MBean,以使您能够执行现场诊断操作。 其API使用户可以在运行时执行堆转储并设置其他VM选项。 您可以通过展开com.sun.management节点并选择HotSpotDiagnostic从MBean选项卡访问HotSpot Diagnostic MBean。 HotSpot Diagnostic MBean提供的方法如图7所示:
从Java SE 6开始,JConsole包含插件支持,使您可以构建自己的插件以与JConsole一起运行。 例如,您可以在JConsole主视图中添加一个定制选项卡,以访问特定于应用程序的MBean和执行自己的监视活动。
您必须扩展抽象的com.sun.tools.jconsole.JConsolePlugin类以创建自定义JConsole插件。 您实现了两种方法以使插件在JConsole视图中正确显示:
newSwingWorker()返回一个SwingWorker对象,该对象为您的插件执行GUI更新。 getTabs()返回要添加到JConsole窗口的选项卡的映射。JConsole使用其服务提供者机制来检测和加载所有插件类。 因此,您必须在包含名为META-INF / services / com.sun.tools.jconsole.JConsolePlugin的文件的JAR文件中提供插件类。 该文件应包含标准插件类名称的列表,每行一个。 要将新插件加载到JConsole视图中,请使用以下命令从命令行运行JConsole:
jconsole -pluginpath plugin_path在此命令中, plugin_path指向JConsole插件的目录或存档的路径。 您可以指定多个路径。
Java SE 6附带了一个名为JTop的示例JConsole插件。 JTop显示了当前应用程序中运行的线程的CPU使用率。 要使用JTop运行JConsole,请执行以下命令:
jconsole -pluginpath JAVA_HOME/demo/management/JTop/JTop.jar图8显示了JConsole上的一个实例,该实例选择了JTop选项卡。 左列显示所有正在运行的线程的名称。 对于每个线程,将显示CPU使用率和线程状态。 统计信息更改后,此视图将自动刷新。 JTop插件对于识别CPU消耗高的线程很有用。
除了JConsole之外,Java SE 6还支持许多其他命令行工具。 这些诊断工具可以附加到任何应用程序,而无需以特殊模式启动该应用程序。 它们使您能够获取有关应用程序的更多信息,以确定它是否按预期运行。 请注意,这些工具被列为实验工具,将来的Java SE版本可能未完全支持这些工具。
Java SE 6包括三个命令行实用程序,如表2所示,它们可用于监视JVM性能统计信息:
jps实用程序列出了目标系统上当前用户的虚拟机。 该实用程序在使用JNI Invocation API(而不是标准Java启动器)启动VM的环境中很有用。 在这些环境中,在进程列表中识别Java进程并不总是那么容易。 jps工具可缓解此问题。
以下示例演示了jps实用程序的用法。 只需在命令行上输入jps ,该实用程序就会列出用户具有访问权限的虚拟机和进程ID,如清单3中的示例所示:
jstat实用程序使用JVM的内置工具来提供有关正在运行的应用程序的性能和资源消耗的信息。 该工具可用于诊断性能问题,尤其是与堆大小和垃圾回收有关的问题。
jstatd守护程序是一个远程方法调用(RMI)服务器应用程序,它监视JVM的创建和终止,并提供一个接口,以允许远程监视工具连接到在本地主机上运行的JVM。 例如,此守护程序允许jps实用程序列出远程系统上的进程。
请参阅相关主题对于这些工具的更多文档和使用实例。
Java SE 6还包括表3中列出的许多故障排除工具,这些工具可以帮助您查明应用程序中表现异常的部分:
jinfo命令行实用程序从正在运行的Java进程或故障转储中检索配置信息,并打印用于启动虚拟机的系统属性或命令行标志。
jhat工具提供了一种方便的方法来浏览堆快照中的对象拓扑。 该工具在Java SE 6发行版中引入,以代替堆分析工具(HAT),可用于检测内存泄漏。
jmap命令行实用程序为正在运行的VM或核心文件打印与内存相关的统计信息。 该实用程序还可以使用jsadebugd守护程序来查询远程计算机上的进程或核心文件。 jmap工具可用于诊断对终结器的过度使用,这可能导致OutOfMemoryError 。
可维护性代理调试守护程序( jsadebugd )附加到Java进程或核心文件,并充当调试服务器。 该实用程序当前仅在Solaris OS和Linux®上可用。 远程客户端(例如jstack , jmap和jinfo可以使用Java RMI附加到此服务器。
jstack命令行实用程序将附加到指定的进程或核心文件,并打印附加到虚拟机的所有线程(包括Java线程和VM内部线程)以及可选的本机堆栈帧的堆栈跟踪。 该实用程序还执行死锁检测。 它可以使用jsadebugd守护程序来查询远程计算机上的进程或核心文件。 jstack工具对于诊断死锁很有用。
请参阅相关主题对于这些工具的更多文档和使用实例。
Java 6平台对VM工具,管理API和JDK工具进行了一些增强,以帮助您有效地识别和诊断Java应用程序中的性能和内存问题。 本文介绍了对Java SE监视和管理框架的改进,并介绍了开发人员可用的诊断命令行实用程序。
随着时间的推移,平均Java应用程序速度稳步提高。 现在,在Java SE 6发行版中,Java性能可与C或C ++媲美。 在许多情况下,Java代码的运行速度明显加快。 您可以使用此处介绍的工具来实现更好的性能优化。 试试看。 我们保证您会找到自己不知道可以优化应用程序的地方。
翻译自: https://www.ibm.com/developerworks/java/library/j-java6perfmon/index.html
相关资源:IBM之java性能诊断工具初探-IBM Support assitant的使用.docx