ZGC介紹
Z Garbage Collector,即ZGC煮纵,基于Region內(nèi)存布局,不設(shè)置分代, 使用了讀屏障, 染色指針和內(nèi)存多重映射等技術(shù)實(shí)現(xiàn)的可并發(fā)標(biāo)記-整理算法的英遭,是一個(gè)可伸縮的庵佣、低延遲的垃圾收集器检柬,主要為了滿足如下目標(biāo)進(jìn)行設(shè)計(jì):
- 停頓時(shí)間不會超過10ms
- 停頓時(shí)間不會隨著堆的增大而增大(不管多大的堆都能保持在10ms以下)
- 可支持幾百M(fèi)服球,甚至幾T的堆大熊钋 (最大支持4T)
和G1開啟很像,用下面參數(shù)即可開啟:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
ZGC特性
- Concurrent(并發(fā)執(zhí)行)
- Region-based(內(nèi)存基于region斩熊,類似G1)
- Compacting(壓縮)
- NUMA-aware(Numa架構(gòu)往枣,一種內(nèi)存頁合并的硬件技術(shù))
- Using colored pointers(著色指針)
- Using load barriers(讀屏障)
(1)Concurrent
ZGC只有短暫的STW,大部分的過程都是和應(yīng)用線程并發(fā)執(zhí)行座享,比如最耗時(shí)的并發(fā)標(biāo)記和并發(fā)移動(dòng)過程捕犬。
(2)Region-based
ZGC中沒有新生代和老年代的概念级零,只有一塊一塊的內(nèi)存區(qū)域page,這和G1的region有點(diǎn)像,但和G1不一樣的是岂丘,region的大小更加靈活和動(dòng)態(tài)。zgc的region不會像G1那樣在一開始就被劃分為固定大小的region巢寡。
zgc的region核心亮點(diǎn)就是:動(dòng)態(tài)。
動(dòng)態(tài)表現(xiàn)為:
- 動(dòng)態(tài)地創(chuàng)建和銷毀饺著。
- 動(dòng)態(tài)地決定region的大小。它的最小單位是2MB的一個(gè)塊肠牲。然后每個(gè)region的大小就是是2MB*N就是幼衰。
(3)Compacting
每次進(jìn)行GC時(shí),都會對page進(jìn)行壓縮操作缀雳,所以完全避免了CMS算法中的碎片化問題渡嚣。
(4)NUMA-aware
(2)Colored Pointers
是zgc的一個(gè)核心概念。你還可以叫它tag pointers肥印,version pointers识椰。
和以往的標(biāo)記算法比較不同,CMS和G1會在對象的對象頭進(jìn)行標(biāo)記深碱,而ZGC是標(biāo)記對象的指針腹鹉。
一個(gè)pointer共64bit。開始的18bit暫時(shí)沒有被用到(以后有可能要用)敷硅,然后是四個(gè)bit功咒,分別表示Finalizable、Remapped绞蹦、Marked1力奋、Marked0,這是gc過程中每個(gè)對象的狀態(tài)坦辟。最后42bit是用來存儲對象的地址刊侯。
(3)Using load barriers
因?yàn)樵跇?biāo)記和移動(dòng)過程中,GC線程和應(yīng)用線程是并發(fā)執(zhí)行的锉走,所以存在這種情況:對象A內(nèi)部的引用所指的對象B在標(biāo)記或者移動(dòng)狀態(tài)滨彻,為了保證應(yīng)用線程拿到的B對象是對的,那么在讀取B的指針時(shí)會經(jīng)過一個(gè) “l(fā)oad barriers” 讀屏障挪蹭,這個(gè)屏障可以保證在執(zhí)行GC時(shí)亭饵,數(shù)據(jù)讀取的正確性。