分类:
2008-09-10 10:07:57
BEA JRockit 虚拟机(JVM)所带来的不仅仅是性能的提升。本文探讨了JRockit 5.0 R26版本可用的一些管理和使用方面的特性。概述了JRockit Mission Control分析工具套件、JRockit Management Console的试验性headless模式以及使用Ctrl-Break Handler、JRCMD、堆视图和code coverage与JVM进行交互。
简介
JRockit JVM不只是快,它还和JRockit Mission Control一起,组成一套执行运行时分析和内存泄漏检测的分析工具,JRockit Management Console包含在JRockit JDK中。本文将探讨JRockit Management Console的一种试验性的headless模式,它可以用于与来自命令行的基于JRockitJMX的管理代理进行交互。Ctrl-Break Handler提供了一种向JRockit发送各种高级命令的方法,甚至是在它启动后。这些命令甚至可以远程调用,我在后文中会提及。最后,我探讨了试验性的code coverage,JRockit开箱即用地提供了该特性。
关于BEA JRockit的更多信息,参见dev2dev网站的JRockit Product Center。
首先我将快速概述一下JRockit JVM可用的已确定的管理工具,然后我会转向缺少文档的试验性管理特性。
JRockit Mission Control
JRockit R26.0.0版本引入了JRockit Mission Control工具套件,它包含的工具可以进行监控、管理、分析和消除应用程序内存泄漏,而不会引起通常与此类工具相关联的性能开销。Mission Control的低性能开销是因为使用了作为JRockit常规适应性动态调优的一部分而收集的数据,这还可以消除工具使用字节码装置修改系统执行特性时发生Heisenberg异常的问题。JRockit Mission Control功能可以根据需要随时可用,低性能开销也只在运行工具时有效。这些特征使得JRockit Mission Control成为专门用于生产中系统的工具。
JRockit Mission Control中包含以下工具:
关于JRockit Mission Control的更多信息,可以阅读文章An Introduction to JRockit Mission Control,或者访问dev2dev网站的JRockit Mission Control。
JRockit Management Console的Headless模式(试验性)
JRockit Management Console是监控JRockit运行的工具。它包括两部分:一个运行在JVM进程中的JMX代理,一个使用图形化用户界面的独立客户端(关于它以及其它方面的更详细的信息,请参见An Introduction to JRockit Mission Control)。其中,用户界面可以绘出部署在所连接的Java虚拟机中的任何MBean的数值属性的图形。图形密集的应用程序对资源的消耗可能会相当厉害,JRockit Management Console也不例外。可以引入text-only(纯文本)模式,以便使用Management Console的通知功能和数据收集工具而不会导致整个GUI的开销。
headless控制台引入了大量新的命令行参数。这同样适用于控制台的GUI版本。参数包括:
参数 | 描述 |
---|---|
-headless | 以headless模式启动控制台(不会加载与GUI相关的类)。 |
-settings |
使用指定配置文?舳?H绻?訥UI模式启动,并且该文件不存在,那么它将在关闭Management Console时创建。 |
-connectall | 连接配置文件中所有可用连接(即原先使用GUI添加的)。 |
-connect |
使用GUI连接配置文件中可用的指定连接。 |
-autoconnect | 自动连接到运行在启用JRockit发现(JRockit Discovery Protocol,JDP)的管理上的任何JRockit。 |
-uptime | 将控制台运行一段指定的时间,然后自动关闭它。 |
-useraction |
经过指定的时延后运行指定的用户动作。如果不指定period,动作将只执行一次;如果指定,动作将每过 |
-version | 打印Management Console的版本信息,并退出。 |
-locale |
使用特定的地区启动控制台,比如,-locale ja JP将以日语启动控制台(JRockit R27可用)。 |
这里给出一个以headless模式启动Management Console的例子,读取指定配置文件,尝试连接所有已指定的JRockit,使用JRockit发现(JDP,下文讨论)积极查找新的JRockit。30秒后将以每分钟一次的间隔向所有连接的JRockit发送Ctrl-Break命令。一小时之后自动关闭。以前加入指定连接的所有通知规则(不管是通过使用GUI还是通过直接编辑配置文件添加的)将生效。
java -jar ManagementConsole.jar -headless -settings C:\Headless\consolesettings.xml -connectall -autoconnect -uptime 3600 -useraction ctrlbreak 30 60
用户动作是可以与JRockit Management Console上的一组连接进行交互的插件类,同样使用控制台配置文件来配置数据。用户动作显示在JRockit控制台图形用户界面的Plugins菜单下,headless模式中也可用。随控制台提供了两个默认用户动作:jrarecording用户动作,对连接的JRockit启动JRA记录;ctrlbreak用户动作,向连接的JRockit发送Ctrl-Break命令(参见本文中关于Ctrl-Break Handler和JRockit运行时分析器的小节)。要指定特定用户动作的参数,可以使用GUI进行配置,也可以编辑Management Console配置文件,后者可以在
编写自己的用户动作很容易。首先创建一个AbstractUserAction的子类。该示例演示了如何创建一个从所有连接的JRockit获取线程堆栈转储的用户动作。
package com.example.useractions; import java.io.IOException; import java.util.List; import com.jrockit.console.rjmx.CommonRJMXNames; import com.jrockit.console.rjmx.RJMXConnectorModel; import com.jrockit.console.useractions.AbstractUserAction; /** * This is a simple user action, getting stackdumps from * the selected JRockits and printing them on stdout. * * @author Marcus Hirt */ public class MyUserAction extends AbstractUserAction { public void executeAction(Listconnections) { for (RJMXConnectorModel connection : connections) { if (connection.isConnected()) { try { System.out.println(CommonRJMXNames.getThreadMXBean(connection).getThreadStackDump()); } catch (IOException e) { e.printStackTrace(); } } } } }
接下来,需要在consolesettings.xml文件中配置部属描述符,以便用户动作对于控制台可用。可以在配置文件中发现user_actions元素,它已经填充了一些user_action元素。示例动作的部署描述符应当以相同的样式输入。描述符看起来会是这样:
com.example.useractions.MyUserAction stackdump Stack Dump on stdout Gets a stack dump from the selected JRockit(s), and dumps it on stdout.
这也使得用户动作在Plugins菜单下的用户界面中可见。
当控制台启动或退出时,如果有设置/状态需要从配置文件加载/保存,只需重写exportToXml()/importFromXml()方法,如示例中所示:
/** * @see com.jrockit.console.util.XmlEnabled * #exportToXml(org.w3c.dom.Element) */ public void exportToXml(Element parentNode) { super.exportToXml(parentNode); XmlToolkit.setSetting(parentNode, MY_PROPERTY, m_myVal); } /** * @see com.jrockit.console.util.XmlEnabled * #initializeFromXml(org.w3c.dom.Element) */ public void initializeFromXml(Element parentNode) { super.initializeFromXml(parentNode); m_myVal = XmlToolkit.getSetting(parentNode, MY_PROPERTY, DEFAULT_MY_VALUE)); }
注意,用户动作的名称是使用launcher启动参数时将引用的用户动作名称,菜单名是会在GUI菜单中显示的名称。更多的信息请参见user action docs和JLMEXT docs。注意,这只是一个试验性的功能,提供的文档还相当简单,编写定制的通知动作和约束的方式与此类似。更多信息请参见Management Console User Guide。
JRockit发现(JDP)
JDP(JRockit发现协议)是个简单且有效的协议,用于允许JRockit管理服务器向Management Console组播它的存在。下面的两个表分别列出了在服务器端和客户端控制JDP行为的系统属性。
管理服务器的JDP属性
系统属性 | 描述 | 默认值 |
---|---|---|
jrockit.managementserver.autodiscovery | 启用JRockit发现协议 | False |
jrockit.managementserver.discovery.period | 在两个ping之间需要等待多久(以毫秒为单位) | 5000 |
jrockit.managementserver.discovery.ttl | 活跃的跃点数 | 1 |
jrockit.managementserver.discovery.address | 所使用的组播地址 | 232.192.1.212 |
jrockit.managementserver.discovery.port | 所使用的组播端口 | 7095 |
Management Console的JDP属性
系统属性 | 描述 | 默认值 |
---|---|---|
com.jrockit.console.preferences.jdp.port | 用于JRockit发现协议的端口 | 7095 |
com.jrockit.console.preferences.jdp.address | 所使用的组播地址 | 232.192.1.212 |
这里给出了在服务器端启用JDP的情况下,启动JRockit需要最少参数的示例。
java -Xmanagement -Djrockit.managementserver.autodiscovery=true
Ctrl-Break Handler
您是否曾经希望在JVM启动后可以使用一种轻松的方式与其交互?假如说您忘记添加-Xmanagement选项来启动管理服务器,或者您想改变运行系统中GC的冗余级别。这些现在很容易通过重新配置Ctrl-Break Handler来完成,而且它不只是打印堆栈跟踪。
[1]