bea jrockit mission control是一組功能強大的工具,它是與bea jrockit 5.0 r26 jdk一起提供的。這些工具提供先進且不顯眼的jvm監(jiān)控和管理,適用于開發(fā)和生產(chǎn)環(huán)境。本文簡要介紹了jrockit mission control,描述了該套件中的主要組件,該套件的組件與其他競爭技術(shù)之間的區(qū)別,以及如何使用它們來管理jrockit jvm部署。
簡介jrockit mission control是與jrockit 5.0 r26 jdk一起提供的工具的總稱。它是一組swing應(yīng)用程序,用于以不同的方式收集和分析來自jrocikit運行時的信息。jrockit mission control的下一個版本將基于eclipse rich client platform以及以eclipse插件形式出現(xiàn)的獨立工具。
當(dāng)前用于監(jiān)控、管理和分析java運行時的大部分技術(shù)都使用了相當(dāng)具有侵入性的技術(shù),比如字節(jié)碼裝置和jvmpi(現(xiàn)已廢棄不用并被jvmti所取代)。jrockit mission control主要關(guān)注在完成必需的工具檢測的同時對運行的系統(tǒng)造成最小的影響。它所使用的技術(shù)還使得工具與jvm斷開連接之后應(yīng)用程序立刻可以以全速運行。因此,jrockit mission control適用于在生產(chǎn)環(huán)境中使用。它的開銷非常小,這可以將heisenberg效應(yīng)降至最低,并為應(yīng)用程序提供比其他開銷更大的技術(shù)更有代表性的數(shù)據(jù)。
下面讓我們看一看jrockit mission control的各個組件。
jrockit management consolejrockit management console是一個基于jmx的控制臺,用于管理和監(jiān)控jrockit jvm。它提供至關(guān)重要的狀態(tài)數(shù)據(jù)和控制jrockit jvm的運行時特性的方法。在這些屬性中,可以監(jiān)控的是live set、堆使用、cpu負(fù)載和由在jvm內(nèi)部平臺mbean服務(wù)器中注冊的mbean所公開的其他所有屬性。jrockit management console還包括一個開銷低的方法分析器和一個異常計數(shù)器。
要使用jrockit management console來監(jiān)控jrockit jvm,首先必須啟動要監(jiān)控的jvm中的管理代理。為此,可以使用jrcmd或ctrl-break handler,借助于the_xmanagement標(biāo)志(參見jrockit management console文檔)來啟動jrockit jvm。還可以使用jrcmd和ctrl-break handler來關(guān)閉管理代理。jrockit management console由一個運行在jrockit進程中的代理和一個獨立的jrockit management console swing應(yīng)用程序組成,前者用于公開在jvm內(nèi)部平臺mbean服務(wù)器中注冊的mbean。
如圖1所示,可以將多個jrockit management console實例連接到一個jrockit jvm上,而且一個management console也可以連接到多個jrockit jvm。management console應(yīng)該運行在不同的機器上,或者使用–settings選項標(biāo)志以使用不同的設(shè)置文件。注意,因為控制臺可以處理多個jrockit jvm,通常不需要在同一臺機器上運行多個management console。
圖1: bea jrockit management console 通信(單擊圖像查看大圖)
從高級架構(gòu)的角度來說,被監(jiān)控的jrockit包括:
一組接口——到j(luò)ava.lang管理接口的jrockit擴展。也存在一個動態(tài)生成的mbean,用于把jrockit的所有性能計數(shù)器公開為屬性。這些擴展被內(nèi)部命名為java.lang.management擴展,或者簡寫為jlmext。 一個用于公開這些接口的代理——與控制臺的通信是借助于基于rmi的遠(yuǎn)程jmx來實現(xiàn)的。 jdp (jrockit discovery protocol) server——management console通過使用多播傳遞特定jrockit的位置而執(zhí)行自動檢測。jdp server是可選的。為了支持jdp,需要使用-djrockit.managementserver.autodiscovery=tru系統(tǒng)屬性選項來啟動jvm。method profiler提供一種開銷非常低的方法來統(tǒng)計一個方法被調(diào)用的次數(shù)以及在該方法上花費的時間。只需使用少量裝置代碼就可以重新生成感興趣的方法,而且只要分析器一停止,這些代碼就會被刪除。因此,使用方法分析器的開銷只有在對選定方法進行分析的時候,而且只有被選定的方法才會有這種開銷。特定于jrockit的接口的相關(guān)javadocs發(fā)布在mission control的主頁上。
從高級架構(gòu)的角度來看,management console swing應(yīng)用程序包括:
rjmx (jrockit remote jmx服務(wù))——提供持久化、屬性訂閱抽象和通知框架之類的服務(wù)。 jdp client——自動發(fā)現(xiàn)支持jdp的jrockit jvm。 management console gui (參見圖2)——swing應(yīng)用程序。圖2: bea jrockit management console (單擊圖像查看大圖)
management console應(yīng)用程序引入了屬性訂閱(attribute subscription)的概念,這個經(jīng)過簡化的概念是由mbean objectname、attribute name和訂閱時間間隔來定義的。控制臺允許用戶添加通知規(guī)則,區(qū)分和持久化來自這類屬性訂閱的數(shù)據(jù)。屬性訂閱可以基于常規(guī)的jmx mbean屬性,來自一個屬性的單個復(fù)合數(shù)據(jù)鍵,或者jmx通知數(shù)據(jù)(因為來自這類訂閱的事件都是異步傳輸?shù),所以在這里訂閱時間間隔沒有什么意義)?梢愿鶕(jù)數(shù)據(jù)的其他幾種屬性訂閱創(chuàng)建自己的復(fù)合屬性訂閱,或者甚至創(chuàng)建由實現(xiàn)者來提供數(shù)據(jù)的合成屬性訂閱。
總而言之,jrockit management console是十分靈活的。jms監(jiān)控器和管理工具提供了很多有價值的功能:
以圖形的方式顯示任意數(shù)字屬性。 持久化任意屬性集以達到離線分析的目的。 特殊的屬性訂閱,用于以圖形的方式方便地顯示暫停時間、live set使用和連續(xù)的堆使用情況。 當(dāng)特定屬性的用戶指定條件出現(xiàn)時,通知規(guī)則可以發(fā)揮作用。 用戶可以插入自己的通知動作和約束的代碼。 java運行時的管理,包括動態(tài)修改垃圾收集策略、堆大小、nursery大小、jrockit進程相似性、啟用/禁用冗長標(biāo)志等等。 低開銷的方法分析器。 異常計數(shù)器。 一種啟動jrockit runtime analyzer 記錄的方法。 一種動態(tài)調(diào)用mbean操作的方法。 一種調(diào)用jrockit ctrl-break handler的方法。想要了解更多有關(guān)如何配置控制臺以使用ssl、身份驗證和角色的信息,請參考jrockit文檔。
jrockit runtime analyzer (jra)jra是一個java應(yīng)用程序,同時也是一個jvm分析器。它在jrockit開發(fā)團隊中已經(jīng)存在了相當(dāng)長一段時間,創(chuàng)建它的原始目的是讓jrockit開發(fā)人員能夠找到良好的方法來基于現(xiàn)實應(yīng)用程序優(yōu)化jvm,但是事實證明,它對于幫助客戶在生產(chǎn)和開發(fā)環(huán)境中解決問題十分有用。為什么jvm用戶無法讓jvm開發(fā)人員訪問或處理整個應(yīng)用程序呢?這有很多原因。jra的工作方式就像一個動態(tài)的記錄器,它記錄了java應(yīng)用程序和jvm在一段預(yù)定的時間內(nèi)的行為。然后,您可以使用jra應(yīng)用程序來分析記錄過程,例如,可以分析熱門方法的調(diào)用跟蹤、錯誤的同步和其他重要的應(yīng)用程序/jvm行為。bea支持機構(gòu)一般使用來自客戶的jra記錄來幫助bea客戶解決問題。
jra由兩個部分組成:jvm中的記錄引擎和可以用于分析結(jié)果記錄的gui應(yīng)用程序。記錄引擎使用的信息源有幾種,包括jrockit hot spot detector(優(yōu)化引擎也使用它來決定應(yīng)該優(yōu)化哪些方法)、操作系統(tǒng)、jrockit memory system(最出名的就是垃圾收集器)和jrockit鎖定分析器(如果支持的話)。
借助于jra工具,您可以通過圖形輕松地分析jra記錄中包含的信息(如圖3所示)。圖上可以顯示暫停時間、堆使用和記錄期間提交的堆大小?梢赃x擇任意的垃圾收集(gc),它會提供有關(guān)特定垃圾收集的十分詳細(xì)的信息?梢垣@取對熱門方法的調(diào)用跟蹤——不僅僅是為調(diào)用方法做準(zhǔn)備的調(diào)用跟蹤,還包括描繪通常接下來會調(diào)用的方法的調(diào)用跟蹤。調(diào)用跟蹤還顯示是否調(diào)用了一個方法的優(yōu)化版本。
圖 3: bea jrockit runtime analyzer (單擊圖像查看大圖)
在記錄過程的開始和結(jié)束階段都會使用堆直方圖,它可以說明每個類(例如占據(jù)超過所使用堆控件0.5%的類)所使用的堆空間大小。所收集的堆信息也用于顯示堆使用情況的餅形圖。
記錄時產(chǎn)生的開銷非常低——通常低于2%。然而,因為jra在記錄過程開始和結(jié)束階段都會進行一次完全的垃圾收集,以生成堆直方圖數(shù)據(jù),所以記錄過程的開始和結(jié)束階段都會出現(xiàn)一個開銷的高峰。
有幾種啟動jra記錄的方式:
使用jrockit management console。 使用jrcmd。 使用支持jmx的java.lang.managemetn類的jrockit擴展。 使用jra -xxjra 命令行參數(shù)。還可以使用通知規(guī)則從management console觸發(fā)jra記錄,例如,可以創(chuàng)建一條規(guī)則,當(dāng)cpu負(fù)載超過90%時啟動jra記錄。
可以這樣說,jra是一個功能強大的jvm和java應(yīng)用程序分析器,它提供了一下功能:
有效地分析jvm和java應(yīng)用程序(開銷通常低于3%)。 方法調(diào)用跟蹤顯示了采用哪條路徑到達方法以及接下來會調(diào)用哪個方法。 方法熱點表,說明最常被調(diào)用的方法是哪些。 十分詳細(xì)的垃圾收集統(tǒng)計信息,說明每個gc過程中發(fā)生的各種情況。 垃圾收集策略更改。 堆使用和暫停時間的圖表顯示。 堆直方圖,顯示在記錄過程的開始和結(jié)束階段每個類對堆的使用情況。 詳細(xì)的鎖定分析,顯示存在爭用時采用了哪些鎖定、它們被使用了多少次等等。 顯示每個對象使用堆空間情況的餅形圖,包括存儲碎片。 在記錄期間優(yōu)化了哪些方法。想要了解有關(guān)使用jra的更多信息,請參考jrockit mission control 文檔。
jrockit memory leak detectorjrockit memory leak detector工具可以幫助您快速發(fā)現(xiàn)內(nèi)存泄漏。雖然java的自動內(nèi)存管理機制把開發(fā)人員從顯式地分配和釋放所使用內(nèi)存的重?fù)?dān)下解放出來,但如果程序繼續(xù)引用不再有用的對象時,內(nèi)存泄漏還是有可能發(fā)生。
jrockit memory leak detector 為用戶提供了一個趨勢分析,讓用戶能夠快速找到甚至減緩內(nèi)存泄漏。趨勢分析可以說明應(yīng)用程序中每個類使用堆空間的情況。它將告訴您某一類型的實例使用了多少空間、它們占用了堆的哪一部分、存在多少個實例以及每秒鐘堆空間使用的增加速度(以字節(jié)為單位)。
jrockit memory leak detector還提供快速找出泄漏原因的手段。可以在趨勢分析表中選擇一個懷疑類型,所有具有指向選中類型的實例的類型都可以顯示在一個圖中(如圖4所示)。圖形節(jié)點可以隨意展開,用戶可以回溯到導(dǎo)致引用的最終原因。類的實例可以被顯示和內(nèi)觀,指向一個選中實例的所有實例都可以在一張實例圖中顯示出來?梢源蜷_分配跟蹤,跟蹤某個類的所有分配情況。
想要查看有關(guān)如何使用該工具的例子和指導(dǎo),請參見jrockit mission control 文檔和dev2dev上的文章:memory leaks, be gone!。
圖 4: bea jrockit memory leak detector (單擊圖像查看大圖)
啟動一個memory leak detector會話時,就會同時啟動一個memory leak server (mls)。根據(jù)連接到的jrockit的jdk版本,所使用的要么是jmx connector in jlmext (5.0),要么是rockit management protocol (rmp) (1.4)。請注意協(xié)議的不同和網(wǎng)絡(luò)特性及安全的區(qū)別。memory leak server是一個本地服務(wù)器,借助于它,通信的余下部分便可以在會話發(fā)生的期間完成。在客戶端,可以使用一個java api與本地服務(wù)器通信(參見圖5)。使用本地服務(wù)器的原因是,如果出現(xiàn)嚴(yán)重的內(nèi)存泄漏情況,而jrockit用完了java堆,jrockit將無法再運行java代碼。
圖 5: bea jrockit memory leak detector通信 (單擊圖像查看大圖)
memory leak detector工作在垃圾收集器的標(biāo)記階段,用于添加一些薄記來記錄堆直方圖(每個類合計使用的堆內(nèi)存的統(tǒng)計信息)和生成趨勢分析。在競爭性的工具中,找出內(nèi)存泄漏的常用解決方案是對整個系統(tǒng)的整個堆取幾個快照,然后比較這些快照。在生產(chǎn)環(huán)境中存在具有數(shù)億兆字節(jié)的系統(tǒng),在這樣的系統(tǒng)中,這種方法并不可行。借助于jrockit memory leak detector,只有感興趣的信息才會進行在線傳送,這使得它對帶寬的要求很低。當(dāng)使用分配調(diào)用跟蹤功能時,只有涉及到所選類的分配點的代碼才會被檢測。此外,當(dāng)會話一結(jié)束,或者分配跟蹤被關(guān)閉,檢測就會被刪除,而涉及到這些分配點的代碼又將全速執(zhí)行。
總而言之,jrockit memory leak detector是一種先進的分析工具,它具有大量新特性:
它可以執(zhí)行趨勢分析,這樣做甚至可以發(fā)現(xiàn)緩慢的內(nèi)存泄漏。 它進行在線分析,依賴于jrockit memory manager,而不是多次把整個堆轉(zhuǎn)儲到客戶端,并分析其區(qū)別。 它提供一個高級的用戶界面,讓用戶可以找到并分析泄漏類型和其他類型之間的關(guān)系,或者泄漏實例和其他實例之間的關(guān)系。 檢測器帶來的開銷很低,可以用于生產(chǎn)環(huán)境中的在線分析。 不使用字節(jié)碼檢測。當(dāng)使用memory leak detector進行分析時,java代碼將繼續(xù)執(zhí)行,就好像它從未連接上一樣。不需要修改任何java代碼。可以說,jrockit memory leak detector是發(fā)現(xiàn)和找出java內(nèi)存泄漏原因的最佳工具。想要了解有關(guān)jrockit memory leak detector的更多信息,請參考jrockit mission control 文檔。
結(jié)束語現(xiàn)在的jrockit jdk包含一個多用途的工具套件,可用于進行監(jiān)控、管理、分析和消除應(yīng)用程序中的內(nèi)存泄漏。jrockit mission control可免費用于開發(fā)。它可以可靠地用在生產(chǎn)環(huán)境中,而且在使用之后,也不會在系統(tǒng)中留下任何痕跡。在實際應(yīng)用中,它所引起的性能開銷要比其他工具小的多。
參考資料memory leaks, be gone!,作者staffan larsen (dev2dev, 2005年6月) ——提供大量有關(guān)內(nèi)存泄漏檢測系統(tǒng)的信息。 new features and tools in jrockit 5.0,作者eva andreasson (dev2dev, 2005年2月)——總結(jié)了jrockit 5.0中的許多特性,雖然有些過時,但仍然實用。 dev2dev站點上的jrockit product center dev2dev站點上的mission control section——包含更多關(guān)于jrockit工具的信息。