1.JConsole
JConsole随Java 5和更高版本分發,位于%JAVA_HOME%/bin目錄下。
可以用來監控堆使用,類加載、CPU使用以及線程情況,如下圖所示:
[img]http://dl2.iteye.com/upload/attachment/0105/9586/48030418-361c-31e1-8b85-0845de2d5a67.jpg[/img]
個人感覺除了線程tab頁,點選線程可以看到執行的線程堆棧,以及可以通過[檢測到死鎖]按鈕友善的檢視死鎖的線程外,其餘功能可以被jvisualvm替代。
2.JVisualVM
JVisualVM從Java 6 Update 7引入,雖然JVisualVM運作需要依賴Java 6,但是它同樣可以監控運作在java 1.4和java 5中的應用。JVisualVM被視為第2代JConsole。
常用功能:
1)建立線程轉儲
2)建立記憶體轉儲
3)提供了CPU和記憶體性能分析功能,但不如NetBeans Profiler強大,NetBeans Profiler可以監視熱點方法占用CPU百分比還記錄了方法調用次數,記憶體監視則比JVisualVM多記錄了對象年齡,另外還可以檢視調用堆棧。
[img]http://dl2.iteye.com/upload/attachment/0105/9588/4435b2f9-df1f-30ae-a9a4-1d6b634cfe6f.jpg[/img]
3. VisualGC
本章着重介紹一下VisualGC。
VisualGC是JVisualVM的插件。
在JVisualVM中選擇"工具"->"插件",在"可用插件"tab頁中,選中visualgc,然後點選安裝,下載下傳完畢後重新開機JVisualVM,如果看到下圖的visualgc tab頁則說明安裝成功。
[img]http://dl2.iteye.com/upload/attachment/0105/9590/300758a8-218f-3d0c-a286-8f1d8f383cc6.jpg[/img]
1)Spaces區域。
這些垃圾收集區域與JVM給他們配置設定的最大值成比例,深色區域是永久代的目前使用量,灰色則代表最大值,另外未配置設定記憶體為淺灰,已配置設定記憶體為深灰。上圖中由于給-Xms和-Xmx設定了相同的值來避免記憶體頻發擴充,是以上圖中看不到淺灰區域。
Perm:永久代情況。
Old:老年代情況。
Eden:新生代Eden區域。
S0和S1:新生代兩個Survivor區域。
2)Graphs區域。
Compile Time(編譯時間):487 compiles 表示編譯總數,4.277s表示編譯累計時間。一個脈沖表示一次JIT編譯,窄脈沖表示持續時間短,寬脈沖表示持續時間長。
Class Loader Time(類加載時間): 3322loaded表示加載類數量, 0 unloaded表示解除安裝的類數量,1.577s表示類加載花費的時間。
GC Time(GC Time):3collections表示垃圾收集的總次數,9.242ms表示垃圾收集花費的時間,last cause表示最近垃圾收集的原因。
Eden Space(Eden 區):括号内的511.875M表示最大容量,384.000M表示目前容量,後面的292.562M表示目前使用情況,2collections表示垃圾收集次數,9.242ms表示垃圾收集花費時間。
Survivor 0/Survivor 1(S0和S1區):括号内的170.625M表示最大容量,64.000M表示目前容量,之後的值是目前使用情況。
Old Gen(老年代):括号内的1.500G表示最大容量,1.500G表示目前容量,之後的0表示目前使用情況,0collections表示垃圾收集次數 ,0s表示垃圾收集花費時間。
Perm Gen(永久代):括号内的64.000M表示最大容量,64.000M表示目前容量,之後的24.874M表示目前使用情況。
如果使用CMS或者Serial收集器,還會顯示Histogram用來顯示Survivor中對象的年齡。如果經常出現實際晉升閥值小于最大晉升閥值,則說明發生了Survivor溢出,需要進行JVM優化。
參考資料:
1. Charlie Hunt Binu John 著 柳飛 陸明剛譯《Java性能優化權威指南》