十種GC垃圾回收器

劉狗發表於2020-10-08

 

分代

serial和serial old

1.serial和serial old <!--jdK3,4的時候使用的--> 單執行緒執行,序列

serial(年輕代,copying)   :   單執行緒,需要gc時會停止工作執行緒,stw(stop-the-world) ,gc完之後在繼續工作。
serial old(老年代  mark-sweep/mark-compact)  :  單執行緒,當需要gc的時候,需要停止工作執行緒,stw,gc之後繼續工作
​
缺點:單執行緒,stw時間會很長,記憶體越大越不適用

parallel Scavenge 和 Parallel old (ps,po)

jdk1.8預設回收器。調優會可能從pspo-> cms,g1等等

ps:(年輕代,copying)  : 多個gc執行緒,當需要gc的時候,也需要stw,gc之後才能在繼續工作
​
po(老年代,mark-compact)   : 多執行緒,當需要gc時, stw,gc後繼續工作
​
缺點:gc stw,多執行緒資源開銷

ParNew 和 CMS

ParNew (年輕代  coping): 多個gc執行緒,stw     和ps一樣。 
​
CMS (老年代 mark-compact):大致會分為4個階段。
​
初始標記。(工作執行緒還是會stw,在初始標記階段只找到根上的物件,然後就恢復工作執行緒)
​
併發標記。 (工作執行緒和gc執行緒會共同進行,底層使用的三色標記法。CMS解決方案就是會根據記憶體寫屏障將黑色物件變為灰色,繼續跟蹤下去標記。因為併發GC執行緒,所以就會又ABA問題(第一個執行緒標記完子關係會變成黑色,第二個執行緒掃描的時候可能因為物件又引用了別的子關係,會變成灰色,但是第一個執行緒標記完之前的關係後又變成了黑色))
​
重新標記。(所以cms的remark階段就會從頭掃描一遍。)
​
併發清理   然後進行清理垃圾
​
缺點:當CMS碎片話越來越嚴重的時候,CMS會使用SerialOld來清理老年代,也就是單執行緒並且stw.

 

不分代

g1

g1 (三色標記法,標記清理演算法) 和CMS類似。對三色標記法的解決方案不一樣,適合大記憶體。比如堆大於6-8G

G1解決方案:SATB   :灰色物件指定的標記消失的時候,會把這個引用標記推到GC的堆疊,保證GC掃描能再次掃描到,再次掃描只需要掃描那些region引用到該region。但是佔空間,region種還有百分之20左右記錄著誰引用的我。
缺點:空間佔用資源大。

zgc

(jdk11 使用的顏色指標來判斷該物件的狀態,使用了讀屏障)

每一個引用在64位機器上佔用的都是64位,在ZGC使用引用的時候只用了其中的42位,來代表指向某個物件的真正地址,高18位沒用,中間有4位代表指向的這個物件的狀態
Zgc能管理4T的記憶體(2的42次方),最大能管理16T的記憶體(2的44次方)。

Shenandoah (jdk11)

使用了讀屏障,轉發指標

Epsilon

( 只做記憶體分配而不做記憶體回收(reclaim) )

相關文章