BEA JRockit Java虛擬機(JVM)所帶來的不僅僅是性能的提升本文探討了JRockit R版本可用的一些管理和使用方面的特性概述了JRockit Mission Control分析工具套件JRockit Management Console的試驗性headless模式以及使用CtrlBreak HandlerJRCMD堆視圖和code coverage與JVM進行交互
簡介
JRockit JVM不只是快它還和JRockit Mission Control一起組成一套執行運行時分析和內存洩漏檢測的分析工具JRockit Management Console包含在JRockit JDK中本文將探討JRockit Management Console的一種試驗性的headless模式它可以用於與來自命令行的基於JRockitJMX的管理代理進行交互CtrlBreak Handler提供了一種向JRockit發送各種高級命令的方法甚至是在它啟動後這些命令甚至可以遠程調用我在後文中會提及最後我探討了試驗性的code coverageJRockit開箱即用地提供了該特性
關於BEA JRockit的更多信息參見devdev網站的JRockit Product Center
首先我將快速概述一下JRockit JVM可用的已確定的管理工具然後我會轉向缺少文檔的試驗性管理特性
JRockit Mission Control
JRockit R版本引入了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或者訪問devdev網站的JRockit Mission Control
JRockit Management Console的Headless模式(試驗性)
JRockit Management Console是監控JRockit運行的工具它包括兩部分一個運行在JVM進程中的JMX代理一個使用圖形化用戶界面的獨立客戶端(關於它以及其它方面的更詳細的信息請參見An Introduction to JRockit Mission Control)其中用戶界面可以繪出部署在所連接的Java虛擬機中的任何MBean的數值屬性的圖形圖形密集的應用程序對資源的消耗可能會相當厲害JRockit Management Console也不例外可以引入textonly(純文本)模式以便使用Management Console的通知功能和數據收集工具而不會導致整個GUI的開銷
headless控制台引入了大量新的命令行參數這同樣適用於控制台的GUI版本參數包括
參數 |
描述 |
headless
以headless模式啟動控制台(不會加載與GUI相關的類)
settings <settings file>
使用指定配置文舳H绻訥UI模式啟動
並且該文件不存在
那麼它將在關閉Management Console時創建
connectall
連接配置文件中所有可用連接(即原先使用GUI添加的)
connect <connection
> <connection
> <
>
使用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 R
可用)
這裡給出一個以headless模式啟動Management Console的例子讀取指定配置文件嘗試連接所有已指定的JRockit使用JRockit發現協議(JDP下文討論)積極查找新的JRockit秒後將以每分鐘一次的間隔向所有連接的JRockit發送CtrlBreak命令一小時之後自動關閉以前加入指定連接的所有通知規則(不管是通過使用GUI還是通過直接編輯配置文件添加的)將生效
java jar ManagementConsolejar headless
settings C:\Headless\consolesettingsxml connectall
autoconnect uptime useraction ctrlbreak
用戶動作是可以與JRockit Management Console上的一組連接進行交互的插件類同樣使用控制台配置文件來存儲配置數據用戶動作顯示在JRockit控制台圖形用戶界面的Plugins菜單下headless模式中也可用隨控制台提供了兩個默認用戶動作jrarecording用戶動作對連接的JRockit啟動JRA記錄ctrlbreak用戶動作向連接的JRockit發送CtrlBreak命令(參見本文中關於CtrlBreak Handler和JRockit運行時分析器的小節)要指定特定用戶動作的參數可以使用GUI進行配置也可以編輯Management Console配置文件後者可以在<userhome>/ManagementConsole/ManagementConsole/consolesettings<version>xml文件中找到
編寫自己的用戶動作很容易首先創建一個AbstractUserAction的子類該示例演示了如何創建一個從所有連接的JRockit獲取線程堆棧轉儲的用戶動作
package comexampleuseractions;
import javaioIOException;
import javautilList;
import nsolerjmxCommonRJMXNames;
import nsolerjmxRJMXConnectorModel;
import nsoleuseractionsAbstractUserAction;
/**
* 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 (connectionisConnected())
{
try
{
Systemoutprintln(CommonRJMXNamesgetThreadMXBean(connection)getThreadStackDump());
}
catch (IOException e)
{
eprintStackTrace();
}
}
}
}
}
接下來需要在consolesettingsxml文件中配置部屬描述符以便用戶動作對於控制台可用可以在配置文件中發現user_actions元素它已經填充了一些user_action元素示例動作的部署描述符應當以相同的樣式輸入描述符看起來會是這樣
<user_action>
<user_action_class>comexampleuseractionsMyUserAction</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 nsoleutilXmlEnabled
* #exportToXml(orgwcdomElement)
*/
public void exportToXml(Element parentNode)
{
superexportToXml(parentNode);
XmlToolkitsetSetting(parentNode MY_PROPERTY m_myVal);
}
/**
* @see nsoleutilXmlEnabled
* #initializeFromXml(orgwcdomElement)
*/
public void initializeFromXml(Element parentNode)
{
superinitializeFromXml(parentNode);
m_myVal = XmlToolkitgetSetting(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
discoveryperiod
在兩個ping之間需要等待多久(以毫秒為單位)
jrockit
managementl
活躍的躍點數
jrockit
managementserver
discovery
address
所使用的組播地址
jrockit
managementserver
discovery
port
所使用的組播端口
Management Console的JDP屬性
系統屬性 |
描述 |
默認值 |
nsole
preferencesjdpport
用於JRockit發現協議的端口
nsolepreferencesjdp
address
所使用的組播地址
這裡給出了在服務器端啟用JDP的情況下啟動JRockit需要最少參數的示例
java Xmanagement Djrockitmanagementserverautodiscovery=true<your program>
CtrlBreak Handler
您是否曾經希望在JVM啟動後可以使用一種輕松的方式與其交互?假如說您忘記添加Xmanagement選項來啟動管理服務器或者您想改變運行系統中GC的冗余級別這些現在很容易通過重新配置CtrlBreak Handler來完成而且它不只是打印堆棧跟蹤
用法
創建一個名為ctrlhandler
act的文件
向ctrlhandler
act文件添加命令(參見下文命令列表)
以
stop
結束文件
這是結束文件分析的保留命令
按下ctrl
break
每一個命令都將以出現的順序執行
JRockit首先會在當前工作目錄查找該文件如果未找到JRockit將在JVM目錄中查找如果仍然沒有的話JRockit將回退以生成一個常規的線程堆棧轉儲JRockit將在每次按下ctrlbreak時讀取act文件因此用戶可以在方便時重新配置該文件而同時JRockit仍在運行
這裡給出一個示例act文件它首先打印時間戳然後是用於啟動JRockit的命令行最後是一個線程堆棧轉儲它還包括可以用於act文件的有用命令的列表
# Example ctrlhandleract file
timestamp
command_line
print_threads
stop
# 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 ctrlbreak 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_utfpool
# Print all UTF strings
# jrarecording [filename=<file>] [time=<time>] [nativesamples=true]
# Starts a JRA recording
# run_optfile [filename=<file>]
# See OptFile
# start_management_server
# Starts the new JMXbased 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 isnt named
# kill_rmp_server is that stop is a reserved keyword
# that stops the parsing of the act file ;)
# help [ctrlbreak handler]
# Prints all available ctrlbreak handlers if no argument
# is specified or help for the specified ctrlbreak handler
# memleakserver [port=<port>]
# Toggles the memleakserver If it hasnt been started
# it will be started If it has already started it will be
# shut down The default port is
# 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 dont 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實用工具是一種新的調用CtrlBreak Handler的便捷方式可在JRockit發行版的bin目錄中找到它
用法
jrcmd <PID> <command> <parameters>
JRCMD
使用JRCMD實用工具是一種新的調用CtrlBreak 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設為那麼命令將發送給在本地機器上運行的所有JRockit JVM
要列出特定的JRockit中有哪些CtrlBreak Handler可用可以使用help命令
jrcmd <PID> help
要想獲得某個具體的CtrlBreak Handler的幫助信息需要在help後添加CtrlBreak Handler的名稱比如
jrcmd help kill_management_server
也可以使用JRCMD列出指定進程的性能計數
jrcmd <PID> l
遠程調用CtrlBreak Handler
可以使用JRockit Management Console來遠程調用CtrlBreak Handler存在一個對JRockitConsoleMBean的操作稱為runCtrlBreakHandlerWithResultJRockit Management Console可以從屬性浏覽器調用對MBean的操作這裡有關於如何調用CtrlBreak Handler的逐步描述
連接到一個運行中的JRockit
右擊該連接
選擇Browse Attributes
展開comjrockit domain文件夾
選擇JRockitConsole MBean
單擊operations選項卡
查看可用操作
單擊String parameter參數按鈕
找到runCtrlBreakHandlerWithResult操作
輸入希望執行的Ctrl
Break Handler名稱
語法與ctrlhandler
act文件相同
按下OK
按下Execute按鈕
執行操作
試著輸入help作為參數將會列出所有可用的CtrlBreak Handler如圖所示
圖從JRockit Management Console調用CtrlBreak Handler(單擊圖片查看大圖)
堆視圖(試驗性)
當分析應用程序如何使用某種垃圾收集策略時在每一次GC後對堆進行快照將會非常有幫助這有助於開發人員研究數據比如碎片/壓縮以及算法通常如何執行但是快照中包含如此多的數據量以至於查看它沒有什麼意義因此JRockit團隊開發了一個提供圖形化表示的小工具以便更好地進行說明
圖顯示了一個快照的例子(使用的是一個非常早的JRockit 預發布版本)
每一排表示一次垃圾收集左邊是開始的堆右邊是結束的堆堆顯示的右邊是一個可配置圖形實心白色區域表示空白堆黑色區域是充實區(也就是填充了對象的區域)淺灰色區域是碎片區紅色黃色和綠色區域是可配置圖形可以從命令行指定在可配置圖形中顯示什麼該工具依然很粗糙對於用戶也不夠友好不過毋庸置疑它對JRockit的終端用戶非常有用所以這是一個非常不錯但是不能通用的工具
code coverage(試驗性)
很多開發人員在以某種方式使用他們的應用程序時使用code coverage分析來研究諸如代碼庫中的多少以及哪些部分正在運行之類的狀況測試人員喜歡使用code coverage來度量測試套件覆蓋應用程序的比例但是對於大型應用程序由code coverage工具所引起的性能開銷通常是被禁止的
JRockit內置了高性能的行code coverage當啟用code coverage運行時代碼將由記錄行命中的捕獲器生成一旦某行被命中並記錄就刪除捕獲器JRockit可以繼續以接近全速的速度運行
要使JRockit記錄code coverage數據必須指定一個命令行選項
用法 Xcodecoverage
可以使用以下系統屬性來控制該行為
系統屬性 |
描述 |
decoverage
filter=
<filterspec>
filterspec是個以分號(Windows)或冒號(Linux)隔開的篩選器字符串列表
它定義哪些類應當被覆蓋
以
開頭的篩選器字符串會被視為不應當覆蓋的類
示例
decoveragefilter=
java/util/Hashtable;com/bea/*;com/bea/bla*
decoveragefilterfile=
<filename>
設置包含篩選器定義的文件的文件名
文件格式為每行一個篩選器字符串
decoverage
outputfile=
<filename>
設置存放輸出的文件
如果寫入<filename>_
輸出文件不能被打開
那麼將嘗試<filename>_
以此類推
在多個JVM共享一個公共命令行的情況中
這可能會很有用
decoverage
testid=
<id
string>
設置初始測試標識符
decoverage
verbose
使code coverage更為詳細
適用於在覆蓋文件(均是純文本文件)中執行文本比較
decoverage
appendoutput
設置對輸出文件的寫入為追加而不是覆蓋
這裡給出特定於code coverage的參數用於生成如下圖中所示的數據
Xcodecoverage decoveragefilter=com/jrockit/console/*;com/jrockit/common/* decoverageoutputfile=console_coveragetxt
在內部由一個code coverage小工具來解釋JRockit所生成的數據如圖所示
圖code coverage工具的輸出示例
結束語
BEA對Java運行時的掌控將其置於一個獨一無二的位置BEA交付了一些針對Java平台的低開銷的管理和監控特性很多針對BEA JRockit的有趣的管理和使用特性正在開發中其中一些已經隨著包含在JRockit R中的JRockit Mission Control而可以使用更多特性也即將出現更多信息請參見Mission Control home page
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26298.html