Java性能調(diào)優(yōu)工具“JRMC”的介紹

字號:

【編者按】
    Java虛擬機(JVM)及垃圾收集器(GC)負責管理大多數(shù)的內(nèi)存任務,但是Java應用系統(tǒng)中還是有可能出現(xiàn)內(nèi)存泄漏。事實上,OOM之類的現(xiàn)象在大型項目中也是一個常見的問題。避免內(nèi)存泄漏的第一步是要弄清楚它是如何發(fā)生的,然后對癥下藥。
    【正文】
    Java虛擬機(JVM)及垃圾收集器(GC)負責管理大多數(shù)的內(nèi)存任務,但是Java應用系統(tǒng)中還是有可能出現(xiàn)內(nèi)存泄漏。事實上,OOM之類的現(xiàn)象在大型項目中也是一個常見的問題。避免內(nèi)存泄漏的第一步是要弄清楚它是如何發(fā)生的,然后對癥下藥。
    那究竟是什么導致了 Java 程序中的內(nèi)存泄漏呢?難道 Java 虛擬機的垃圾收集器不應該管理未使用的內(nèi)存嗎?是的,它會進行管理,但是垃圾收集的對象只能是不再被引用的對象。但是,某些不再需要的對象,卻在系統(tǒng)的某個地方仍在引用它,這樣就不能對這些對象進行垃圾收集,在日志中的大量String對象的生成以及編寫Java代碼時的一些常見的內(nèi)存泄漏陷阱等等都會造成內(nèi)存泄漏,但是要在開發(fā)階段完成找出造成泄漏的代碼是非常困難的。
    在大型企業(yè)系統(tǒng)中,Java代碼中的內(nèi)存泄漏是常見而且難于解決的問題。這些泄漏問題通常是在最不愿意它發(fā)生的正式生產(chǎn)環(huán)境中發(fā)現(xiàn)的,而且它也很難于在開發(fā)與測試環(huán)境中得到重現(xiàn)。這是為什么呢?生產(chǎn)環(huán)境中的系統(tǒng)需要處理更大量的數(shù)據(jù),而且有可能在運行很長時間后才會發(fā)現(xiàn) Java堆在緩慢地增長。最終,導致系統(tǒng)內(nèi)存耗盡。
    因此本文介紹一種新工具BEA JRockit Mission Control,用來診斷泄漏并指出根本原因。該工具的開銷非常小,因此可以使用它來尋找生產(chǎn)環(huán)境中的系統(tǒng)的內(nèi)存泄漏。
    簡介
    BEA JRockit Mission Control(以下簡稱為JRMC)于2005年12月面世,并從JRockit R26.0.0版本開始捆綁了這個工具套件,目前最新的版本是2.0.1。它是一組以極低的開銷來監(jiān)控、管理和分析生產(chǎn)環(huán)境中的應用程序的工具。它包括三個獨立的應用程序:內(nèi)存泄漏監(jiān)測器(Memory Leak Detector)、JVM運行時分析器(Runtime Analyzer)和管理控制臺(Management Console)。
    JRockit Management Console
    JRockit Management Console是一個基于JMX的控制臺,用于監(jiān)控和管理多個JRockit實例,提供至關(guān)重要的狀態(tài)數(shù)據(jù)和控制JRockit JVM的運行時特性的方法。它捕獲并顯示關(guān)于垃圾收集器(GC)暫停、內(nèi)存、堆使用和CPU負載的實時數(shù)據(jù),以及部署在JVM內(nèi)部MBean服務器上注冊的所有JMX MBean所公開的信息。JVM管理包括對CPU相似性、垃圾收集策略和內(nèi)存池大小的動態(tài)控制,還包括一個開銷低的方法分析器和一個異常計數(shù)器。
    JRockit Runtime Analyzer
    JRockit Runtime Analyzer(JRA)是一個JVM分析器,是一個隨需應變的“動態(tài)記錄器”Java應用程序,它記錄了Java應用程序和JVM在一段預定的時間內(nèi)的詳細記錄。然后通過JRA應用程序?qū)τ涗浵聛淼奈募M行離線分析。所記錄的數(shù)據(jù)包括對方法的調(diào)用跟蹤、錯誤的同步、鎖定的分析,還有垃圾收集統(tǒng)計信息,優(yōu)化決策以及對象統(tǒng)計信息和其他重要的應用程序/JVM行為。它的目的是讓JRockit開發(fā)人員能夠找到良好的方法來基于現(xiàn)實應用程序優(yōu)化JVM,對于幫助客戶在生產(chǎn)和開發(fā)環(huán)境中解決問題十分有用。
    JRA由兩個部分組成:JVM中的記錄引擎和可以用于分析結(jié)果記錄的GUI應用程序。記錄引擎使用的信息源有幾種,包括JRockit Hot Spot Detector(優(yōu)化引擎也使用它來決定應該優(yōu)化哪些方法)、操作系統(tǒng)、JRockit Memory System(最出名的就是垃圾收集器)和JRockit鎖定分析器(如果支持的話)。
    JRockit Memory Leak Detector
    雖然Java的自動內(nèi)存管理機制把開發(fā)人員從顯式地分配和釋放所使用內(nèi)存的重擔下解放出來,但如果程序繼續(xù)引用不再有用的對象時,內(nèi)存泄漏還是有可能發(fā)生。JRockit Memory Leak Detector工具用來發(fā)現(xiàn)和查找內(nèi)存泄漏原因。趨勢分析器為用戶提供了一個趨勢分析,可以發(fā)現(xiàn)非常緩慢的泄漏,顯示詳細的堆統(tǒng)計信息(包括指向泄漏對象和分配位置的引用類型和實例),可以說明應用程序中每個類使用堆空間的情況,顯示某一類型的實例使用了多少空間、它們占用了堆的哪一部分、存在多少個實例以及每秒鐘堆空間使用的增加速度(以字節(jié)為單位),并快速找出泄漏原因。使用先進的圖形化表現(xiàn)技術(shù),以便更容易定位和理解有時比較復雜的信息。
    JRockit Memory Leak Detector還提供快速找出泄漏原因的手段。可以在趨勢分析表中選擇一個懷疑類型,所有具有指向選中類型的實例的類型都可以顯示在一個圖中。圖形節(jié)點可以隨意展開,用戶可以回溯到導致引用的最終原因。類的實例可以被顯示,指向一個選中實例的所有實例都可以在一張實例圖中顯示出來。可以跟蹤某個類的所有分配情況。