標籤:visual gc java visualvm jvm heap dump
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
650) this.width=650;" title="捕獲.PNG" alt="wKiom1VUeQiyixcuAAMnGJdLLuU385.jpg" src="http://s3.51cto.com/wyfs02/M00/6C/E1/wKiom1VUeQiyixcuAAMnGJdLLuU385.jpg" />
安裝完成後重啟Java VisualVM,Visual GC介面自動開啟,即可看到JVM中堆記憶體的分代情況
650) this.width=650;" title="捕獲.PNG" alt="wKiom1VUfh3QOdwoAAR5bOWPUSQ180.jpg" src="http://s3.51cto.com/wyfs02/M00/6C/E1/wKiom1VUfh3QOdwoAAR5bOWPUSQ180.jpg" />
被監控的程式運行一段時間後Visual GC顯示如下
650) this.width=650;" title="捕獲.PNG" alt="wKiom1VUih3zWsSPAAXS4juKDgs487.jpg" src="http://s3.51cto.com/wyfs02/M02/6C/E2/wKiom1VUih3zWsSPAAXS4juKDgs487.jpg" />
要看懂上面的圖必須理解Java虛擬機器的一些基本概念:
堆(Heap) :JVM管理的記憶體叫堆
分代:根據對象的生命週期長短,把堆分為3個代:Young,Old和Permanent,根據不同代的特點採用不同的收集演算法,揚長避短也。
Young(年輕代)
年輕代分三個區。一個Eden區,兩個Survivor區。大部分對象在Eden區中產生。當Eden區滿時,還存活的對象將被複製到Survivor區(兩個中的一個),當這個Survivor區滿時,此區的存活對象將被複製到另外一個Survivor區,當這個Survivor去也滿了的時候,從第一個Survivor區複製過來的並且此時還存活的對象,將被複製“年老區(Tenured)”。需要注意,Survivor的兩個區是對稱的,沒先後關係,所以同一個區中可能同時存在從Eden複製過來對象,和從前一個Survivor複製過來的對象,而複製到年老區的只有從第一個Survivor複製過來的對象。而且,Survivor區總有一個是空的。
Tenured(年老代)
年老代存放從年輕代存活的對象。一般來說年老代存放的都是生命期較長的對象。
Perm(持久代)
用於存放靜態檔案,如今Java類、方法等。持久代對記憶體回收沒有顯著影響,但是有些應用可能動態產生或者調用一些class,例如Hibernate等,在這種時候需要設定一個比較大的持久代空間來存放這些運行過程中新增的類。持久代大小通過-XX:MaxPermSize=進行設定。
GC的基本概念
gc分為full 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:
記憶體溢出 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是記憶體溢出。
記憶體泄露 memory leak,是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體泄露危害可以忽略,但記憶體泄露堆積後果很嚴重,無論多少記憶體,遲早會被佔光。其實說白了就是該記憶體空間使用完畢之後未回收。
二 Java VisualVM的其他功能
1.監視介面(cpu,類,堆,線程)
650) this.width=650;" title="捕獲.PNG" alt="wKioL1VUhwezuqlHAAPtVDlu7j8689.jpg" src="http://s3.51cto.com/wyfs02/M01/6C/DD/wKioL1VUhwezuqlHAAPtVDlu7j8689.jpg" />
2.線程介面
650) this.width=650;" title="捕獲.PNG" alt="wKiom1VUhl7zciIhAAPgDckTjF8605.jpg" src="http://s3.51cto.com/wyfs02/M01/6C/E2/wKiom1VUhl7zciIhAAPgDckTjF8605.jpg" />
3.Profile介面(效能剖析)
點擊CPU按鈕執行cpu分析查看方法
650) this.width=650;" title="捕獲.PNG" alt="wKioL1VUiMHx3I-AAAUZHlSza2c463.jpg" src="http://s3.51cto.com/wyfs02/M00/6C/DD/wKioL1VUiMHx3I-AAAUZHlSza2c463.jpg" />
點擊記憶體按鈕執行記憶體分析查看類
650) this.width=650;" title="捕獲.PNG" alt="wKioL1VUimnDkaQdAAPQ9qZatVg045.jpg" src="http://s3.51cto.com/wyfs02/M01/6C/DD/wKioL1VUimnDkaQdAAPQ9qZatVg045.jpg" />
4.堆dump和線程dump操作
Dump檔案是進程的記憶體鏡像,可以把程式的執行狀態通過調試器儲存到dump檔案中,堆dump的dump檔案內容如所示
650) this.width=650;" title="捕獲.PNG" alt="wKioL1VUjjeyw26xAAQawGDNDUs206.jpg" src="http://s3.51cto.com/wyfs02/M02/6C/DD/wKioL1VUjjeyw26xAAQawGDNDUs206.jpg" />
本文出自 “夢想屬於勇敢者-天行者” 部落格,請務必保留此出處http://tianxingzhe.blog.51cto.com/3390077/1651384
Java程式效能分析工具Java VisualVM(Visual GC)—程式員必備利器