天天看點

9.性能優化-監控-JVM監控工具

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性能優化權威指南》

繼續閱讀