JROCKIT MISSION CONTROL簡介

  摘要

bea jrockit mission control是一組功能強大的工具,它是與bea jrockit 5.0 r26 jdk一起提供的。這些工具提供先進且不顯眼的jvm監控和管理,適用於開發和生產環境。本文簡要介紹了jrockit mission control,描述了該套件中的主要組件,該套件的組件與其他競爭技術之間的區別,以及如何使用它們來管理jrockit jvm部署。

  簡介

jrockit mission control是與jrockit 5.0 r26 jdk一起提供的工具的總稱。它是一組swing應用程式,用於以不同的方式收集和分析來自jrocikit運行時的信息。jrockit mission control的下一個版本將基於eclipse rich client platform以及以eclipse外掛程式形式出現的獨立工具。

當前用於監控、管理和分析java運行時的大部分技術都使用了相當具有侵入性的技術,比如位元組碼裝置和jvmpi(現已廢棄不用並被jvmti所取代)。jrockit mission control主要關注在完成必需的工具檢測的同時對運行的系統造成最小的影響。它所使用的技術還使得工具與jvm下線之後應用程式立刻可以以全速運行。因此,jrockit mission control適用於在生產環境中使用。它的開銷非常小,這可以將heisenberg效應降至最低,並為應用程式提供比其他開銷更大的技術更有代表性的數據。

下面讓我們看一看jrockit mission control的各個組件。

jrockit management console

jrockit management console是一個基於jmx的控制台,用於管理和監控jrockit jvm。它提供至關重要的狀態數據和控制jrockit jvm的運行時特性的方法。在這些屬性中,可以監控的是live set、堆使用、cpu負載和由在jvm內部平台mbean伺服器中註冊的mbean所公開的其他所有屬性。jrockit management console還包括一個開銷低的方法分析器和一個異常計數器。

要使用jrockit management console來監控jrockit jvm,首先必須啟動要監控的jvm中的管理代理。為此,可以使用jrcmd或ctrl-break handler,藉助於the_xmanagement標誌(參見jrockit management console文檔)來啟動jrockit jvm。還可以使用jrcmd和ctrl-break handler來關閉管理代理。jrockit management console由一個運行在jrockit進程中的代理和一個獨立的jrockit management console swing應用程式組成,前者用於公開在jvm內部平台mbean伺服器中註冊的mbean。

如圖1所示,可以將多個jrockit management console實例連線到一個jrockit jvm上,而且一個management console也可以連線到多個jrockit jvm。management console應該運行在不同的機器上,或者使用–settings選項標誌以使用不同的設定檔案。注意,因為控制台可以處理多個jrockit jvm,通常不需要在同一台機器上運行多個management console。

圖1: bea jrockit management console 通信(單擊圖像查看大圖)

從高級架構的角度來說,被監控的jrockit包括:

一組接口——到java.lang管理接口的jrockit擴展。也存在一個動態生成的mbean,用於把jrockit的所有性能計數器公開為屬性。這些擴展被內部命名為java.lang.management擴展,或者簡寫為jlmext。 一個用於公開這些接口的代理——與控制台的通信是藉助於基於rmi的遠程jmx來實現的。 jdp (jrockit discovery protocol) server——management console通過使用多播傳遞特定jrockit的位置而執行自動檢測。jdp server是可選的。為了支持jdp,需要使用-djrockit.managementserver.autodiscovery=tru系統屬性選項來啟動jvm。

method profiler提供一種開銷非常低的方法來統計一個方法被調用的次數以及在該方法上花費的時間。只需使用少量裝置代碼就可以重新生成感興趣的方法,而且只要分析器一停止,這些代碼就會被刪除。因此,使用方法分析器的開銷只有在對選定方法進行分析的時候,而且只有被選定的方法才會有這種開銷。特定於jrockit的接口的相關javadocs發布在mission control的主頁上。

從高級架構的角度來看,management console swing應用程式包括:

rjmx (jrockit remote jmx服務)——提供持久化、屬性訂閱抽象和通知框架之類的服務。 jdp client——自動發現支持jdp的jrockit jvm。 management console gui (參見圖2)——swing應用程式。
圖2: bea jrockit management console (單擊圖像查看大圖)

management console應用程式引入了屬性訂閱(attribute subscription)的概念,這個經過簡化的概念是由mbean objectname、attribute name和訂閱時間間隔來定義的。控制台允許用戶添加通知規則,區分和持久化來自這類屬性訂閱的數據。屬性訂閱可以基於常規的jmx mbean屬性,來自一個屬性的單個複合數據鍵,或者jmx通知數據(因為來自這類訂閱的事件都是異步傳輸的,所以在這裡訂閱時間間隔沒有什麼意義)。可以根據數據的其他幾種屬性訂閱創建自己的複合屬性訂閱,或者甚至創建由實現者來提供數據的合成屬性訂閱。

總而言之,jrockit management console是十分靈活的。jms監控器和管理工具提供了很多有價值的功能:

以圖形的方式顯示任意數字屬性。 持久化任意屬性集以達到離線分析的目的。 特殊的屬性訂閱,用於以圖形的方式方便地顯示暫停時間、live set使用和連續的堆使用情況。 當特定屬性的用戶指定條件出現時,通知規則可以發揮作用。 用戶可以插入自己的通知動作和約束的代碼。 java運行時的管理,包括動態修改垃圾收集策略、堆大小、nursery大小、jrockit進程相似性、啟用/禁用冗長標誌等等。 低開銷的方法分析器。 異常計數器。 一種啟動jrockit runtime analyzer 記錄的方法。 一種動態調用mbean操作的方法。 一種調用jrockit ctrl-break handler的方法。

想要了解更多有關如何配置控制台以使用ssl、身份驗證和角色的信息,請參考jrockit文檔。

jrockit runtime analyzer (jra)

jra是一個java應用程式,同時也是一個jvm分析器。它在jrockit開發團隊中已經存在了相當長一段時間,創建它的原始目的是讓jrockit開發人員能夠找到良好的方法來基於現實應用程式最佳化jvm,但是事實證明,它對於幫助客戶在生產和開發環境中解決問題十分有用。為什麼jvm用戶無法讓jvm開發人員訪問或處理整個應用程式呢?這有很多原因。jra的工作方式就像一個動態的記錄器,它記錄了java應用程式和jvm在一段預定的時間內的行為。然後,您可以使用jra應用程式來分析記錄過程,例如,可以分析熱門方法的調用跟蹤、錯誤的同步和其他重要的應用程式/jvm行為。bea支持機構一般使用來自客戶的jra記錄來幫助bea客戶解決問題。

jra由兩個部分組成:jvm中的記錄引擎和可以用於分析結果記錄的gui應用程式。記錄引擎使用的信息源有幾種,包括jrockit hot spot detector(最佳化引擎也使用它來決定應該最佳化哪些方法)、作業系統、jrockit memory system(最出名的就是垃圾收集器)和jrockit鎖定分析器(如果支持的話)。

藉助於jra工具,您可以通過圖形輕鬆地分析jra記錄中包含的信息(如圖3所示)。圖上可以顯示暫停時間、堆使用和記錄期間提交的堆大小。可以選擇任意的垃圾收集(gc),它會提供有關特定垃圾收集的十分詳細的信息。可以獲取對熱門方法的調用跟蹤——不僅僅是為調用方法做準備的調用跟蹤,還包括描繪通常接下來會調用的方法的調用跟蹤。調用跟蹤還顯示是否調用了一個方法的最佳化版本。


圖 3: bea jrockit runtime analyzer (單擊圖像查看大圖)

在記錄過程的開始和結束階段都會使用堆直方圖,它可以說明每個類(例如占據超過所使用堆控制項0.5%的類)所使用的堆空間大小。所收集的堆信息也用於顯示堆使用情況的餅形圖。

記錄時產生的開銷非常低——通常低於2%。然而,因為jra在記錄過程開始和結束階段都會進行一次完全的垃圾收集,以生成堆直方圖數據,所以記錄過程的開始和結束階段都會出現一個開銷的高峰。

有幾種啟動jra記錄的方式:

使用jrockit management console。 使用jrcmd。 使用支持jmx的java.lang.managemetn類的jrockit擴展。 使用jra -xxjra 命令行參數。

還可以使用通知規則從management console觸發jra記錄,例如,可以創建一條規則,當cpu負載超過90%時啟動jra記錄。

可以這樣說,jra是一個功能強大的jvm和java應用程式分析器,它提供了一下功能:

有效地分析jvm和java應用程式(開銷通常低於3%)。 方法調用跟蹤顯示了採用哪條路逕到達方法以及接下來會調用哪個方法。 方法熱點表,說明最常被調用的方法是哪些。 十分詳細的垃圾收集統計信息,說明每個gc過程中發生的各種情況。 垃圾收集策略更改。 堆使用和暫停時間的圖表顯示。 堆直方圖,顯示在記錄過程的開始和結束階段每個類對堆的使用情況。 詳細的鎖定分析,顯示存在爭用時採用了哪些鎖定、它們被使用了多少次等等。 顯示每個對象使用堆空間情況的餅形圖,包括存儲碎片。 在記錄期間最佳化了哪些方法。

想要了解有關使用jra的更多信息,請參考jrockit mission control 文檔。

jrockit memory leak detector

jrockit memory leak detector工具可以幫助您快速發現記憶體泄漏。雖然java的自動記憶體管理機制把開發人員從顯式地分配和釋放所使用記憶體的重擔下解放出來,但如果程式繼續引用不再有用的對象時,記憶體泄漏還是有可能發生。

jrockit memory leak detector 為用戶提供了一個趨勢分析,讓用戶能夠快速找到甚至減緩記憶體泄漏。趨勢分析可以說明應用程式中每個類使用堆空間的情況。它將告訴您某一類型的實例使用了多少空間、它們占用了堆的哪一部分、存在多少個實例以及每秒鐘堆空間使用的增加速度(以位元組為單位)。

jrockit memory leak detector還提供快速找出泄漏原因的手段。可以在趨勢分析表中選擇一個懷疑類型,所有具有指向選中類型的實例的類型都可以顯示在一個圖中(如圖4所示)。圖形節點可以隨意展開,用戶可以回溯到導致引用的最終原因。類的實例可以被顯示和內觀,指向一個選中實例的所有實例都可以在一張實例圖中顯示出來。可以打開分配跟蹤,跟蹤某個類的所有分配情況。

想要查看有關如何使用該工具的例子和指導,請參見jrockit mission control 文檔和dev2dev上的文章:memory leaks, be gone!。


圖 4: bea jrockit memory leak detector (單擊圖像查看大圖)

啟動一個memory leak detector會話時,就會同時啟動一個memory leak server (mls)。根據連線到的jrockit的jdk版本,所使用的要么是jmx connector in jlmext (5.0),要么是rockit management protocol (rmp) (1.4)。請注意協定的不同和網路特性及安全的區別。memory leak server是一個本地伺服器,藉助於它,通信的餘下部分便可以在會話發生的期間完成。在客戶端,可以使用一個java api與本地伺服器通信(參見圖5)。使用本地伺服器的原因是,如果出現嚴重的記憶體泄漏情況,而jrockit用完了java堆,jrockit將無法再運行java代碼。


圖 5: bea jrockit memory leak detector通信 (單擊圖像查看大圖)

memory leak detector工作在垃圾收集器的標記階段,用於添加一些薄記來記錄堆直方圖(每個類合計使用的堆記憶體的統計信息)和生成趨勢分析。在競爭性的工具中,找出記憶體泄漏的常用解決方案是對整個系統的整個堆取幾個快照,然後比較這些快照。在生產環境中存在具有數億兆位元組的系統,在這樣的系統中,這種方法並不可行。藉助於jrockit memory leak detector,只有感興趣的信息才會進行線上傳送,這使得它對頻寬的要求很低。當使用分配調用跟蹤功能時,只有涉及到所選類的分配點的代碼才會被檢測。此外,當會話一結束,或者分配跟蹤被關閉,檢測就會被刪除,而涉及到這些分配點的代碼又將全速執行。

總而言之,jrockit memory leak detector是一種先進的分析工具,它具有大量新特性:

它可以執行趨勢分析,這樣做甚至可以發現緩慢的記憶體泄漏。 它進行線上分析,依賴於jrockit memory manager,而不是多次把整個堆轉儲到客戶端,並分析其區別。 它提供一個高級的用戶界面,讓用戶可以找到並分析泄漏類型和其他類型之間的關係,或者泄漏實例和其他實例之間的關係。 檢測器帶來的開銷很低,可以用於生產環境中的線上分析。 不使用位元組碼檢測。當使用memory leak detector進行分析時,java代碼將繼續執行,就好像它從未連線上一樣。不需要修改任何java代碼。

可以說,jrockit memory leak detector是發現和找出java記憶體泄漏原因的最佳工具。想要了解有關jrockit memory leak detector的更多信息,請參考jrockit mission control 文檔。

結束語

現在的jrockit jdk包含一個多用途的工具套件,可用於進行監控、管理、分析和消除應用程式中的記憶體泄漏。jrockit mission control可免費用於開發。它可以可靠地用在生產環境中,而且在使用之後,也不會在系統中留下任何痕跡。在實際套用中,它所引起的性能開銷要比其他工具小的多。

參考資料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 dev2dev站點上的mission control section——包含更多關於jrockit工具的信息。