[jrockit]JROCKIT 5.0——轻松玩转JVM
【shitiku.jxxyjl.com--BEA认证】
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 consolejrockit 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 <settings file>使用指定配置文件启动。如果以gui模式启动,并且该文件不存在,那么它将在关闭management console时创建。-connectall连接配置文件中所有可用连接(即原先使用gui添加的)。-connect <connection 1> <connection 2> <...> 使用gui连接配置文件中可用的指定连接。-autoconnect自动连接到运行在启用jrockit发现协议(jrockit discovery protocol,jdp)的管理服务器上的任何jrockit。-uptime <time in seconds>将控制台运行一段指定的时间,然后自动关闭它。-useraction <name> <delay in seconds> <period (optional)>经过指定的时延后运行指定的用户动作。如果不指定period,动作将只执行一次;如果指定,动作将每过<period>秒就执行一次。-version打印management console的版本信息,并退出。-locale <language> <country (optional)>使用特定的地区启动控制台,比如,-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配置文件,后者可以在<user.home>/managementconsole/managementconsole/consolesettings.<version>.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(list connections) { 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元素。示例动作的部署描述符应当以相同的样式输入。描述符看起来会是这样:
<user_action> <user_action_class>com.example.useractions.myuseraction</user_action_class> <user_action_name>stackdump</user_action_name> <user_action_menu_name>stack dump on stdout</user_action_menu_name> <user_action_description>gets a stack dump from the selected jrockit(s), and dumps it on stdout.</user_action_description></user_action>这也使得用户动作在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发现协议falsejrockit.managementserver.discovery.period在两个ping之间需要等待多久(以毫秒为单位)5000jrockit.managementserver.discovery.ttl活跃的跃点数1jrockit.managementserver.discovery.address所使用的组播地址232.192.1.212jrockit.managementserver.discovery.port所使用的组播端口7095
management console的jdp属性 系统属性描述默认值com.jrockit.console.preferences.jdp.port用于jrockit发现协议的端口7095com.jrockit.console.preferences.jdp.address所使用的组播地址232.192.1.212
这里给出了在服务器端启用jdp的情况下,启动jrockit需要最少参数的示例。
java -xmanagement -djrockit.managementserver.autodiscovery=true<your program>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=<file> [append=true]# sets the file that all handlers following this command will# use for printing. you can have several set_filename commands# in a file. it takes two arguments: filename and an optional# append to specify if you want to append to the file # or overwrite it. default is to overwrite the file. # timestamp# prints a timestamp. # print_threads# the normal thread dump.# verbosity [args=<components>] [filename=<file>]# changes the verbosity level normally specified with -xverbose. # version# prints jrockit version information. # command_line# prints the command line used to start jrockit. # print_object_summary# prints heap usage statistics (how much heap is used per class),# together with a delta on how much this has changed since# the last invocation of this ctrl-break handler.# print_memusage# prints a memory usage report of how jrockit is using# the memory.# heap_diagnostics# prints a detailed report of the heap, including ascii graphics # over the heap layout.# print_class_summary# prints all loaded classes. # print_utf8pool# print all utf8 strings. # jrarecording [filename=<file>] [time=<time>] [nativesamples=true]# starts a jra recording.# run_optfile [filename=<file>]# see optfile. # start_management_server# starts the new jmx-based management agent. # kill_management_server# stops the management agent. # start_rmp_server# starts the old management server (actually the listening # socket that in turn starts servers whenever a connection# is established). # kill_rmp_server# stops the old management server (actually shuts down the# listening socket). the only reason it isn"t named # kill_rmp_server is that stop is a reserved keyword # that stops the parsing of the act file. ;) # help [ctrl-break handler]# prints all available ctrl-break handlers if no argument # is specified, or help for the specified ctrl-break handler.# memleakserver [port=<port>]# toggles the memleakserver. if it hasn"t been started # it will be started. if it has already started, it will be# shut down. the default port is 7095.# verbose_referents action=[heap|full|nursery|start|stop]# print verbose reference information.# parameters:# action=[heap|full|nursery|start|stop]# heap - trigger a heap collection and output reference# information# full - trigger a full heap collection (clears softly # reached soft referents)# nursery - trigger a nursery collection (heap collection # if running without nursery)# start - start writing reference information to default# verbose stream# stop - stop writing reference information# print_exceptions # exceptions=[true|all|false] stacktraces=[true|all|false]# enable printing of java exceptions thrown in the vm.# parameters:# exceptions - print exceptions# stacktraces - print exceptions with stacktraces# at least one of the parameters is required.# values for the parameters can be "true|all|false"# true - print all exceptions # except java/util/emptystackexception,# java/lang/classnotfoundexception and # java/security/privilegedactionexception# all - print all exceptions# false - don"t print exceptions# to turn exception printing off completely you need to set# exceptions = false even if it was turned # on by stacktraces = true.jrcmd使用jrcmd实用工具是一种新的调用ctrl-break handler的便捷方式,可在jrockit发行版的bin目录中找到它。用法jrcmd <pid> <command> <parameters>jrcmd
使用jrcmd实用工具是一种新的调用ctrl-break handler的便捷方式,可在jrockit发行版的bin目录中找到它。
如果不指定选项(或者只指定-p),那么将显示运行在本地机器上的所有jrockit的进程id。如果pid设为0,那么命令将发送给在本地机器上运行的所有jrockit jvm。
要列出特定的jrockit中有哪些ctrl-break handler可用,可以使用help命令:
jrcmd <pid> help要想获得某个具体的ctrl-break handler的帮助信息,需要在help后添加ctrl-break handler的名称,比如:
jrcmd 0 help kill_management_server也可以使用jrcmd列出指定进程的性能计数:
jrcmd <pid> -l远程调用ctrl-break handler
可以使用jrockit management console来远程调用ctrl-break handler。存在一个对jrockitconsolembean的操作,称为runctrlbreakhandlerwithresult。jrockit management console可以从属性浏览器调用对mbean的操作。这里有关于如何调用ctrl-break handler的逐步描述。
试着输入“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>filterspec是个以分号(windows)或冒号(linux)隔开的筛选器字符串列表,它定义哪些类应当被覆盖。以“-”开头的筛选器字符串会被视为不应当覆盖的类。
示例:
-djrockit.codecoverage.filter=
java/util/hashtable;com/bea/*;-com/bea/bla.*
<filename>设置包含筛选器定义的文件的文件名。文件格式为每行一个筛选器字符串。jrockit.codecoverage.outputfile=
<filename>设置存放输出的文件。如果写入<filename>_0,输出文件不能被打开,那么将尝试<filename>_1,以此类推。在多个jvm共享一个公共命令行的情况中,这可能会很有用。jrockit.codecoverage.testid=
<id-string>设置初始测试标识符。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。
参考资料
an introduction to jrockit mission control,marcus hirt撰写(dev2dev,2005年12月) memory leaks, be gone,staffan larsen撰写(dev2dev,2005年6月)——提供了关于内存泄漏检测系统的大量信息 new features and tools in jrockit 5.0,eva andreasson撰写(dev2dev,2005年2月) ——提供了一份很早但却很有用的、jrockit 5.0中的多个特性的汇总 dev2dev jrockit product center——包含大量可以订阅的信息和博客 mission control section,dev2dev——包含jrockit工具的更多信息-
[jrockit]JROCKIT 5.0——轻松玩转JVM详细阅读
bea jrockit java虚拟机(jvm)所带来的不仅仅是性能的提升。本文探讨了jrockit 5 0 r26版本可用的一些管理和使用方面的特性。概述了jrockit mission control分析工具套件、jrockit management console的试验性hea...
-
【消息中间件推拉模式】BEA推中间件基础架构 描绘SOA产品发展蓝图详细阅读
bea宣布新的中间件软件基础架构,作为未来该公司所有服务导向架构(service-oriented architecture, soa)产品阵容发展的蓝图。 bea首度在今年开发者大会上宣布soa 360的愿景包含soa基础架构软件及软件元件存储库。名为microservice ar...
-
beautiful|BEA完善Tuxedo 继续加强SOA平台详细阅读
全球领先的企业基础架构软件公司bea系统有限公司宣布在美国旧金山隆重举行的beaworld盛会上公布的bea soa 360平台方面计划存在服务缺点,主动推出补丁应用程序,完善tuxedo,继续加强soa平台计划。当大家都在看好世界企业基建软件领袖bea systems的soa 36...
-
beaker_BEA课程介绍详细阅读
课程介绍产品 课程名称 天数费用(rmb)课程代码bea weblogic server 8 1 bea weblogic server 8 1 administration5 9000 wls-a11-81 j2ee programming with servlets and jsps w...
-
jrockit|JROCKIT MISSION CONTROL简介详细阅读
摘要 bea jrockit mission control是一组功能强大的工具,它是与bea jrockit 5 0 r26 jdk一起提供的。这些工具提供先进且不显眼的jvm监控和管理,适用于开发和生产环境。本文简要介绍了jrockit mission control,描述了该...