网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  jrockit 5.0——轻松玩转jvm     
  文章作者:未知  文章来源:水木森林  
  查看:109次  录入:管理员--2007-11-17  
 

  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 <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发现协议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<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目录中找到它。

用法 jrcmd <pid> <command> <parameters>

  • 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 <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的逐步描述。

  • 连接到一个运行中的jrockit。
  • 右击该连接,选择browse attributes。
  • 展开com.jrockit domain文件夹,选择jrockitconsole mbean。
  • 单击operations选项卡,查看可用操作。
  • 单击string parameter参数按钮,找到runctrlbreakhandlerwithresult操作。
  • 输入希望执行的ctrl-break handler名称。语法与ctrlhandler.act文件相同。按下ok。
  • 按下execute按钮,执行操作。

  试着输入“help”作为参数,将会列出所有可用的ctrl-break handler,如图1所示。

jrockit 5.0——轻松玩转jvm(图一)
图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.*

jrockit.codecoverage.filterfile=
<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所示。

jrockit 5.0——轻松玩转jvm(图二)
图3:code coverage工具的输出示例

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

 
 
上一篇: jrockit jvm对aop的支持    下一篇: 理论与实践: 用弱引用堵住内存泄漏
  相关文档
代码复用的规则 11-17
[java100例]063、线程群组 11-17
applet与servlet通讯 (片段源码) 11-17
java多线程编程基础之非线程的方法 11-17
优化java applet的加载过程 11-17
一个使用java读取串口的程序 11-16
客户端脚本,值得收藏.... 11-17
煮酒论英雄,漫谈java数据库存取技术 11-16
ruby,java的劲敌 11-17
javasocket网络编程初级入门 11-17
pki、set、ssl介绍 11-17
基于corba/web技术构建三层体系结构的应用 11-17
jbuilder editor中光标不能正确定位问题的解决 11-17
java学习的捷径 11-16
1年java历程的回顾、反思与展望(上) 11-16
可以获得键值的applet 11-17
使用hibernate扩展工具hbm2java根据配置文件生成持久化对象类(.. 11-17
谈谈java程序的反编译是如何实现的 11-16
java中关于xml的api惊鸿一瞥 11-16
tomcat 中通过 jndi 配置访问数据库 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息