幾種常見GC簡介

在springboot-admin當中,大概會有以下幾種類型的gc出現,本文我們看看他們分別是什麼意思。

本文使用的垃圾收集器是jdk1.8的PS+PO。

Allocation Failure

顧名思義,就是內存分配失敗導致的GC,常見於年輕代當中。

[GC (Allocation Failure) [PSYoungGen: 196608K->14305K(229376K)] 196608K->14385K(491520K), 0.0212573 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]

GCLocker Initiated GC

使用JNI臨界區的方式操作數組或者字符串時,爲了防止GC過程中jarray或者jstring發生位移,而導致數組指針失效,需要保持它們在JVM Heap中的地址在JNI Critical過程中保持不變。於是JVM實現了GC_locker,用於JNI Critical內阻止其他GC的發生。

當GCLocker被激活且需要發生GC的時候(這裏是否需要GC是各種GC發生時,調用GCLocker::check_active_before_gc()函數check並設置_needs_gc = true的),就會阻塞其他線程進入JNI臨界區;並且在最後一個位於JNI臨界區的線程退出臨界區時,發起一次CGCause爲_gc_locker的GC。這裏解釋了GCLocker Initiated GC發生的原委。

Ergonomics

在JVM中的垃圾收集器中的Ergonomics就是負責自動的調解gc暫停時間和吞吐量之間的平衡,使你的虛擬機性能更好的一種做法。

簡單說就是內存在進行分配的時候,會通過一些算法,預估是否會出現無法分配的問題。如果符合無法分配預估值,會提前進行一次gc。

[Full GC (Ergonomics) [PSYoungGen: 544K->0K(9216K)] [ParOldGen: 6144K->6627K(10240K)] 6688K->6627K(19456K), [Metaspace: 3286K->3286K(1056768K)], 0.0063048 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]

Metadata GC Threshold

這個gc主要發生的條件是元空間,也就是Metadata的參數設置問題。

通常根據我們學習的JVM只是,元空間使用的是本地內存,所以應該與當前服務器的最大內存有關。

但實際不是這樣的,在jdk1.8中,如果不設置元空間的大小,會有一個默認值是21M

所以需要我們啓動的時候指定一個元空間大小:

-XX:MetaspaceSize=128M

GC日誌如下所示:

[GC (Metadata GC Threshold) [PSYoungGen: 170464K->16894K(229376K)] 170544K->16982K(491520K), 0.0213845 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 
[Full GC (Metadata GC Threshold) [PSYoungGen: 16894K->0K(229376K)] [ParOldGen: 88K->16517K(262144K)] 16982K->16517K(491520K), [Metaspace: 20538K->20538K(1067008K)], 0.0345880 secs] [Times: user=0.23 sys=0.02, real=0.04 secs] 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章