簡介
參考官網簡介
https://www.oracle.com/technetwork/java/visualgc-136680.html
官網概述(翻譯中文):
visualgc-可視垃圾收集監視工具
1、概要
2、描述
3、選件
4、虛擬機標識符
5、輸出格式
6、例子
7、蟲子
8、也可以看看
插件安裝
這裏使用的是jdk自帶的jvisualvm安裝Visual GC插件
先找到JDK安裝的位置,在bin目錄下 找到jvisualvm.exe:
1、找到新的更新地址
visualvm新訪問地址:https://visualvm.github.io/index.html
進入“Plugins”,找到對應自己JDK版本的更新地址
進入jvisualvm的插件管理
“工具” - “插件”
在"設置"中修改url地址爲剛纔我們在github上找到的對應我們JDK版本的地址
修改成功後,可用插件即可刷新出來
3、安裝VisualGC插件
4、重啓即可看到VisualGC
插件使用詳情
安裝完插件後重啓軟件,讓後打開idea,隨後便可以在左邊了Local中看到啓動的idea應用,雙擊即可進入監控頁面,如下圖:
右邊就是Visual GC 插件的主要界面了,我們可以看到軟件運行時的內存變化情況
Spaces窗口
上圖是呈現了程序運行時我們比較關注的幾個區域的內存使用情況
- Metaspace:方法區,如果JDK1.8之前的版本,就是Perm,JDK7和之前的版本都是以永久代(PermGen)來實現方法區的,JDK8之後改用元空間來實現(MetaSpace)。
- Old:老年代
- Eden: 新生代Eden區
- S0和S1:新生代的兩個 Survivor 區
Graphs窗口
該窗口區域包含8個圖標,以時間爲橫座標動態展示各個指標的運行狀態
下面從上往下對上圖中的各個圖標表及其狀態進行說明
-
Compile Time:編譯情況
24266 compoles - 39.416s
表示編譯總數爲24266,編譯總耗時爲39.416s。
一個脈衝表示一次JIT
編譯,脈衝越寬表示編譯時間越長。 -
Class Loader Time:類加載情況
49052 loaded,39 unloaded - 29.937s
表示已加載的數量爲49052,卸載的數量爲39,耗時爲29.537s。 -
GC Time:總的(包含新生代和老年代)gc情況記錄
123 collections,859.203ms Last Cause:Allocation Failure
表示一共經歷了123次gc(包含Minor GC和Full GC),總共耗時859.203ms。 -
Eden Space:新生代Eden區內存使用情況
(200.00M,34.125M): 31.52M,109 collections,612.827ms
表示Eden區的最大容量爲200M,當前容量爲34.125M,當前已使用31.52M,從開始監控到現在在該內存區域一共發生了109次gc(Minor GC),gc總耗時爲612.827ms。 -
Survivor 0和Survivor 1:新生代的兩個Survivor區內存使用情況
(25.000M,4.250M):1.757M
表示該Survivor區的最大容量爲25M(默認爲Eden區的1/8),當前已用1.757M。 -
Old Gen:老年代內存使用情況
(500.000M,255.195M):206.660M,14 collections,246.375ms
表示老年區的最大容量爲500M,當前容量爲255.195M,當前已用206.660M,從開始監控到現在在該內存區域一共發生了14次gc(Full GC),gc總耗時爲246.375ms,換算下可以看出單次Full GC要比Minor GC耗時長很多。 -
Metaspace:方法區內存使用情況
(1.053G,278.250M):262.345M
表示方法區最大容量爲1.053G,當前容量爲278.250M,當前使用量爲262.345MM。
Histogram窗口
Histogram窗口是對當前正在被使用的Survivor區內存使用情況的詳細描述,如下
-
Tenuring Threshold:我們知道Survivor區中的對象有一套晉升機制,就是其中的每個對象都有一個年齡標記,每當對象在一次Minor GC中存活下來,其年齡就會+1,當對象的年齡大於一個閾值時,就會進入老年代,這個閾值就是Tenuring Threshold,要注意這個值不是固定不變的,一般情況下Tenuring Threshold會與Max Tenuring Threshold大小保持一致,可如果某個時刻Servivor區中相同年齡的所有對象的內存總等於Survivor空間的一半,那Tenuring Threshold就會等於該年齡,同時大於或等於該年齡的所有對象將進入老年代。
-
Max Tenuring Threshold:表示新生代中對象的最大年齡值,這個值在JDK1.8中默認爲6,在JDK1.7及之前的版本中默認爲15,可以通過參數-XX:MaxTenuringThreshold來指定。
-
Desired Survivor Size:Survivor空間大小驗證閾值(默認是survivor空間的一半),用於給Tenuring Threshold判斷對象是否提前進入老年代。
-
Current Survivor Size:當前Survivor空間大小,單位爲字節(Byte,B)。
-
Histogram柱狀圖:表示Survivor中不同年齡段對象分佈。
參考文獻
https://blog.csdn.net/shuai825644975/article/details/78970371
https://www.oracle.com/technetwork/java/visualgc-136680.html
https://www.jianshu.com/p/9e4ccd705709