Java,Jsp,模式及框架
Web技术
Web服务器
浏览器相关
SQL语言
数据库
开发环境
软件开发及管理
网站SEO
短信及邮件服务
网页设计
电脑、硬件及网络
协同管理平台问题
电子商务
前沿技术及趋势
  当前位置:首页 - 知识积累 - Java,Jsp,模式及框架
jrockit 6.0 介绍和使用
时间:2010年09月16日 

      BEA JRockit Java虚拟机(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工具套件,它包含的工具可以进行监控、管理、分析和消除Java应用程序内存泄漏,而不会引起通常与此类工具相关联的性能开销。 Mission Control的低性能开销是因为使用了作为JRockit常规适应性动态调优的一部分而收集的数据,这还可以消除工具使用字节码装置修改系统执行特性时发生Heisenberg异常的问题。JRockit Mission Control功能可以根据需要随时可用,低性能开销也只在运行工具时有效。这些特征使得JRockit Mission Control成为专门用于生产中系统的工具。

JRockit Mission Control中包含以下工具:

•JRockit Management Console
JRockit Management Console用于监控和管理多个JRockit实例。它捕获并显示关于垃圾收集器(GC)暂停、内存和CPU使用的实时数据,以及部署在JVM内部 MBean服务器上的所有JMX MBean的信息。JVM管理包括对CPU相似性、垃圾收集策略和内存池大小的动态控制。
•JRockit Runtime Analyzer
JRockit Runtime Analyzer(JRA)是一个随需应变的"动态记录器",它生成关于JVM和正在运行的应用程序的详细记录。然后可以使用JRA应用程序对记录下来的配置文件进行离线分析。所记录的数据包括对方法和锁定的分析,还有垃圾收集统计信息,优化决策以及对象统计信息。
•JRockit Memory Leak Detector
JRockit Memory Leak Detector工具用来发现和查找内存泄漏原因。Memory Leak Detector的趋势分析器可以发现非常缓慢的泄漏,显示详细的堆统计信息(包括指向泄漏对象和分配位置的引用类型和实例),并快速找出泄漏原因。 Memory Leak Detector使用先进的图形化表现技术,以便更容易定位和理解有时比较复杂的信息。
  关于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 使用指定配置文件启动。如果以GUI模式启动,并且该文件不存在,那么它将在关闭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配置文件,后者可以在/ManagementConsole/ManagementConsole /consolesettings..xml文件中找到。

  编写自己的用户动作很容易。首先创建一个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来完成,而且它不只是打印堆栈跟踪。

用法
•创建一个名为ctrlhandler.act的文件。
•向ctrlhandler.act文件添加命令(参见下文命令列表)。
•以"stop"结束文件,这是结束文件分析的保留命令。
•按下ctrl-break,每一个命令都将以出现的顺序执行。
  JRockit首先会在当前工作目录查找该文件。如果未找到,JRockit将在JVM目录中查找。如果仍然没有的话,JRockit将回退以生成一个常规的线程堆栈转储。JRockit将在每次按下ctrl-break时读取act文件,因此用户可以在方便时重新配置该文件,而同时JRockit仍在运行。

  这里给出一个示例act文件,它首先打印时间戳,然后是用于启动JRockit的命令行,最后是一个线程堆栈转储。它还包括可以用于act文件的有用命令的列表:

# Example ctrlhandler.act filetimestampcommand_lineprint_threadsstop

# set_filename filename= [append=true]

# Sets the file that all handlers following this command will

......

JRCMD

使用JRCMD实用工具是一种新的调用Ctrl-Break Handler的便捷方式,可在JRockit发行版的bin目录中找到它。用法jrcmd JRCMD
  使用JRCMD实用工具是一种新的调用Ctrl-Break Handler的便捷方式,可在JRockit发行版的bin目录中找到它。

用法jrcmd
•PID = 要在其中执行Ctrl-Break Handler的JRockit进程的进程ID。
•command = 要执行的Ctrl-Break Handler命令。
•parameters = Ctrl-Break Handler的参数。
  如果不指定选项(或者只指定-P),那么将显示运行在本地机器上的所有JRockit的进程ID。如果PID设为0,那么命令将发送给在本地机器上运行的所有JRockit JVM。

  要列出特定的JRockit中有哪些Ctrl-Break Handler可用,可以使用help命令:

jrcmd help
  要想获得某个具体的Ctrl-Break Handler的帮助信息,需要在help后添加Ctrl-Break Handler的名称,比如:

jrcmd 0 help kill_management_server
  也可以使用JRCMD列出指定进程的性能计数:

jrcmd -l
远程调用Ctrl-Break Handler
  可以使用JRockit Management Console来远程调用Ctrl-Break Handler。存在一个对JRockitConsoleMBean的操作,称为runCtrlBreakHandlerWithResult。 JRockit Management Console可以从属性浏览器调用对MBean的操作。这里有关于如何调用Ctrl-Break Handler的逐步描述。

•连接到一个运行中的JRockit。
•右击该连接,选择Browse Attributes。
•展开com.jrockit domain文件夹,选择JRockitConsole MBean。
•单击operations选项卡,查看可用操作。
•单击String parameter参数按钮,找到runCtrlBreakHandlerWithResult操作。
•输入希望执行的Ctrl-Break Handler名称。语法与ctrlhandler.act文件相同。按下OK。
•按下Execute按钮,执行操作。
  试着输入"help"作为参数,将会列出所有可用的Ctrl-Break Handler,如图1所示。


图1.从JRockit Management Console调用Ctrl-Break Handler(单击图片查看大图)

堆视图(试验性)
  当分析应用程序如何使用某种垃圾收集策略时,在每一次GC后对堆进行快照将会非常有帮助。这有助于开发人员研究数据,比如碎片/压缩以及算法通常如何执行。但是快照中包含如此多的数据量以至于查看它没有什么意义,因此JRockit团队开发了一个提供图形化表示的小工具,以便更好地进行说明。

  图2显示了一个快照的例子(使用的是一个非常早的JRockit 1.4.2预发布版本):

  每一排表示一次垃圾收集。左边是开始的堆,右边是结束的堆。堆显示的右边是一个可配置图形。实心白色区域表示空白堆,黑色区域是充实区(也就是填充了对象的区域),浅灰色区域是碎片区,红色、黄色和绿色区域是可配置图形。可以从命令行指定在可配置图形中显示什么。该工具依然很粗糙,对于用户也不够友好,不过毋庸置疑它对JRockit的终端用户非常有用,所以这是一个非常不错但是不能通用的工具。

code coverage(试验性)
  很多开发人员在以某种方式使用他们的应用程序时,使用code coverage分析来研究诸如代码库中的多少以及哪些部分正在运行之类的状况。测试人员喜欢使用code coverage来度量测试套件覆盖应用程序的比例。但是,对于大型应用程序,由code coverage工具所引起的性能开销通常是被禁止的。

  JRockit内置了高性能的行code coverage。当启用code coverage运行时,代码将由记录行命中的捕获器生成。一旦某行被命中并记录,就删除捕获器,JRockit可以继续以接近全速的速度运行。

  要使JRockit记录code coverage数据,必须指定一个命令行选项。

用法-Xcodecoverage
  可以使用以下系统属性来控制该行为:

系统属性 描述
jrockit.codecoverage.filter=
filterspec是个以分号(Windows)或冒号(Linux)隔开的筛选器字符串列表,它定义哪些类应当被覆盖。以"-"开头的筛选器字符串会被视为不应当覆盖的类。
  示例:
-Djrockit.codecoverage.filter=
java/util/Hashtable;com/bea/*;-com/bea/bla.*

jrockit.codecoverage.filterfile=
设置包含筛选器定义的文件的文件名。文件格式为每行一个筛选器字符串。
jrockit.codecoverage.outputfile=
设置存放输出的文件。如果写入_0,输出文件不能被打开,那么将尝试_1,以此类推。在多个JVM共享一个公共命令行的情况中,这可能会很有用。
jrockit.codecoverage.testid=
设置初始测试标识符。
jrockit.codecoverage.verbose 使code coverage更为详细。适用于在覆盖文件(均是纯文本文件)中执行文本比较。
jrockit.codecoverage.appendoutput 设置对输出文件的写入为追加而不是覆盖。

  这里给出特定于code coverage的参数,用于生成如下图中所示的数据。

-Xcodecoverage -Djrockit.codecoverage.filter=com/jrockit/console/*;com/jrockit/common/* -Djrockit.codecoverage.outputfile=console_coverage.txt
  在内部,由一个code coverage小工具来解释JRockit所生成的数据,如图3所示。


图3:code coverage工具的输出示例(点击图片查看大图)

结束语
  BEA对Java运行时的掌控将其置于一个独一无二的位置:BEA交付了一些针对Java平台的低开销的管理和监控特性。很多针对BEA JRockit的有趣的管理和使用特性正在开发中。其中一些已经随着包含在JRockit 5.0 R26中的JRockit Mission Control而可以使用,更多特性也即将出现。更多信息请参见Mission Control home page。