天天看點

Java程式記憶體分析Java VisualVM(Visual GC)JVM的GC簡介和執行個體

visualvm 是一款免費的\內建了多個jdk 指令行工具的可視化工具,它能為您提供強大的分析能力,對 java 應用程式做性能分析和調優。這些功能包括生成和分析海量資料、跟蹤記憶體洩漏、監控垃圾回收器、執行記憶體和 cpu 分析,同時它還支援在 mbeans 上進行浏覽和操作。

在記憶體分析上,java visualvm的最大好處是可通過安裝visual gc插件來分析gc(gabage collection)趨勢、記憶體消耗詳細狀況。

一  visual gc(監控垃圾回收器)

java visualvm預設沒有安裝visual gc插件,需要手動安裝,jdk的安裝目錄的bin目露下輕按兩下jvisualvm.exe,即可打開java visualvm,點選菜單欄 工具->插件 安裝visual gc

Java程式記憶體分析Java VisualVM(Visual GC)JVM的GC簡介和執行個體

安裝完成後重新開機java visualvm,visual gc界面自動打開,即可看到jvm中堆記憶體的分代情況

Java程式記憶體分析Java VisualVM(Visual GC)JVM的GC簡介和執行個體

被監控的程式運作一段時間後visual gc顯示如下

Java程式記憶體分析Java VisualVM(Visual GC)JVM的GC簡介和執行個體

要看懂上面的圖必須了解java虛拟機的一些基本概念:

堆(heap) :jvm管理的記憶體叫堆

分代:根據對象的生命周期長短,把堆分為3個代:young,old和permanent,根據不同代的特點采用不同的收集算法,揚長避短也。

young(年輕代)

tenured(年老代)

年老代存放從年輕代存活的對象。一般來說年老代存放的都是生命期較長的對象。

perm(持久代)

用于存放靜态檔案,如今java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應用可能動态生成或者調用一些class,例如hibernate等,在這種時候需要設定一個比較大的持久代空間來存放這些運作過程中新增的類。持久代大小通過-xx:maxpermsize=進行設定。

<a href="http://www.iteye.com/topic/894148" target="_blank"></a>

gc的基本概念

gc分為full gc 跟 minor gc(young gc也就是minor gc),當每一塊區滿的時候都會引發gc。

scavenge gc

一般情況下,當新對象生成,并且在eden申請空間失敗時,就觸發了scavenge

gc,堆eden區域進行gc,清除非存活對象,并且把尚且存活的對象移動到survivor區。然後整理survivor的兩個區。

full gc

對整個堆進行整理,包括young、tenured和perm。full gc比scavenge

gc要慢,是以應該盡可能減少full gc。有如下原因可能導緻full gc:

上一次gc之後heap的各域配置設定政策動态變化

system.gc()被顯示調用

perm域被寫滿

tenured被寫滿

記憶體溢出  out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是記憶體溢出。

記憶體洩露  memory leak,是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體洩露危害可以忽略,但記憶體洩露堆積後果很嚴重,無論多少記憶體,遲早會被占光。其實說白了就是該記憶體空間使用完畢之後未回收。

檢視java記憶體情況指令(jstat)

 jmap -heap [pid] 檢視記憶體分布

 jstat -gcutil [pid] 1000 每隔1s輸出java程序的gc情況

<a href="http://boendev.iteye.com/blog/882479" target="_blank">http://boendev.iteye.com/blog/882479</a>

<a href="http://www.cnblogs.com/ggjucheng/p/3977384.html" target="_blank">http://www.cnblogs.com/ggjucheng/p/3977384.html</a>

<a href="http://www.searchtb.com/2013/07/jvm-gc-introduction-examples.html" target="_blank">http://www.searchtb.com/2013/07/jvm-gc-introduction-examples.html</a>

二 java visualvm的其他功能

1.監視界面(cpu,類,堆,線程)

Java程式記憶體分析Java VisualVM(Visual GC)JVM的GC簡介和執行個體

2.線程界面

visualvm 的線程标簽提供了三種視圖,預設會以時間線的方式展現。另外兩種視圖分别是表視圖和詳細資訊視圖。

時間線視圖上方的工具欄提供了縮小,放大和自适應三個按鈕,以及一個下拉框,我們可以選擇将所有線程、活動線程或者完成的線程顯示在視圖中。

Java程式記憶體分析Java VisualVM(Visual GC)JVM的GC簡介和執行個體

3.profile界面(性能剖析)

在 profiler 标簽,點選“cpu”按鈕啟動一個 cpu 性能分析會話 ,visualvm 會檢測應用程式所有的被調用的方法。當進入一個方法時,線程會發出一個“method entry”的事件,當退出方法時同樣會發出一個“method exit”的事件,這些事件都包含了時間戳。然後 visualvm 會把每個被調用方法的總的執行時間和調用的次數按照運作時長展示出來。

此外,我們也可以通過性能分析結果下方的方法名過濾器對分析結果進行過濾。

<a href="http://s3.51cto.com/wyfs02/m02/6c/e2/wkiom1vuhyycf2ddaapgdcktjf8614.jpg" target="_blank"></a>

Java程式記憶體分析Java VisualVM(Visual GC)JVM的GC簡介和執行個體

點選記憶體按鈕執行記憶體分析檢視類

Java程式記憶體分析Java VisualVM(Visual GC)JVM的GC簡介和執行個體

我們可以使用 visualvm 的快照功能生成任意個性能分析快照并儲存到本地來輔助我們進行性能分析。快照為捕獲應用程式性能分析資料提供了一個很便捷的方式因為快照一旦生成可以在任何時候離線打開和檢視,也可以互相傳閱。

visualvm 提供了兩種類型的快照:

profiler 快照:當有一個性能分析會話(記憶體或者 cpu)正在進行時,我們可以通過性能分析結果工具欄的“快照”按鈕生成 profiler 快照捕獲當時的性能分析資料。

應用程式快照:我們可以右鍵點選左側 applications 視窗中應用程式節點,選擇“應用程式快照”為生成一個應用程式快照。應用程式快照會收集某一時刻的堆轉儲,線程轉儲和 profiler 快照,同時也會捕獲 jvm 的一些基本資訊。

Java程式記憶體分析Java VisualVM(Visual GC)JVM的GC簡介和執行個體
Java程式記憶體分析Java VisualVM(Visual GC)JVM的GC簡介和執行個體

5.堆dump(轉儲)和線程dump(轉儲)操作

線程轉儲的生成與分析

visualvm 能夠對正在運作的本地應用程式生成線程轉儲,把活動線程的堆棧蹤迹列印出來,幫助我們有效了解線程運作的情況,診斷死鎖、應用程式癱瘓等問題。

visualvm 能夠生成堆轉儲,統計某一特定時刻 jvm 中的對象資訊,幫助我們分析對象的引用關系、是否有記憶體洩漏情況的發生等。

dump檔案是程序的記憶體鏡像,可以把程式的執行狀态通過調試器儲存到dump檔案中,堆dump的dump檔案内容如下圖所示

當 visualvm 統計完堆内對象資料後,會把堆轉儲資訊顯示在新的堆轉儲标簽内,我們可以看到摘要、類、執行個體數等資訊以及通過 oql 【對象查詢語言是專門為odmg(object database management group)對象模型制定的查詢語言】控制台執行查詢語句功能。

堆轉儲的摘要包括轉儲的檔案大小、路徑等基本資訊,運作的系統環境資訊,也可以顯示所有的線程資訊

從類視圖可以獲得各個類的執行個體數和占用堆大小數,分析出記憶體空間的使用情況,找出記憶體的瓶頸,避免記憶體的過度使用。

通過執行個體數視圖可以獲得每個執行個體内部各成員變量的值以及該執行個體被引用的位置。首先需要在類視圖選擇需要檢視執行個體的類。

此外,還能對兩個堆轉儲檔案進行比較。通過比較我們能夠分析出兩個時間點哪些對象被大量建立或銷毀。

線程轉儲和堆轉儲均可以另存成檔案,以便進行離線分析。

詳細講解:

<a href="http://www.ibm.com/developerworks/cn/java/j-lo-visualvm/" target="_blank">http://www.ibm.com/developerworks/cn/java/j-lo-visualvm/</a>

Java程式記憶體分析Java VisualVM(Visual GC)JVM的GC簡介和執行個體