Visual GC(監控垃圾回收器) 整理

簡介

參考官網簡介

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章