ZGC垃圾收集器
ZGC(“Z”并非什么專業(yè)名詞的縮寫,這款收集器的名字就叫作Z Garbage Collector)是一款在JDK 11中新加入的具有實驗性質(zhì)[1]的低延遲垃圾收集器,是由Oracle公司研發(fā)的。
ZGC收集器是一款基于Region內(nèi)存布局的,(暫時)不設(shè)分代的,使用了讀屏障、染色指針和內(nèi)存多重映射等技術(shù)來實現(xiàn)可并發(fā)的標(biāo)記-整理算法的,以低延遲為首要目標(biāo)的一款垃圾收集器。
-
ZGC的Region具有動態(tài)性——動態(tài)創(chuàng)建和銷毀,以及動態(tài)的區(qū)域容量大小??梢跃哂写蟆⒅?、小三類容量:
-
小型Region(Small Region):容量固定為2MB,用于放置小于256KB的小對象。
-
中型Region(Medium Region):容量固定為32MB,用于放置大于等于256KB但小于4MB的對象。
-
大型Region(Large Region):容量不固定,可以動態(tài)變化,但必須為2MB的整數(shù)倍,用于放置
4MB或以上的大對象。每個大型Region中只會存放一個大對象,但它的實際容量完全有可能小于中型Region,最小容量可低至4MB。
-
-
染色指針技術(shù)(Colored Pointer)
染色指針是一種直接將少量額外的信息存儲在指針上的技術(shù)。
64位的Linux則分別支持47位(128TB)的進程虛擬地址空間和46位(64TB)的物理地址空間,64位的Windows系統(tǒng)甚至只支持44位(16TB)的物理地址空間。
ZGC的染色指針技術(shù)將46位指針寬度的高4位取出來存儲4個標(biāo)志信息,通過這些標(biāo)志位,虛擬機可以直接從指針中看到其引用對象的三色標(biāo)記狀態(tài)、是否進入了重分配集(即被移動過)、是否只能通過finalize()方法才能被訪問到,如圖3-20所示。當(dāng)然,由于這些標(biāo)志位進一步壓縮了原本就只有46位的地址空間,也直接導(dǎo)致ZGC能夠管理的內(nèi)存不可以超過4TB(2的42次冪)。
三大優(yōu)勢:
-
染色指針可以使得一旦某個Region的存活對象被移走之后,這個Region立即就能夠被釋放和重用掉,而不必等待整個堆中所有指向該Region的引用都被修正后才能清理。
-
染色指針可以作為一種可擴展的存儲結(jié)構(gòu)用來記錄更多與對象標(biāo)記、重定位過程相關(guān)的數(shù)據(jù),以便日后進一步提高性能。
-
染色指針可以大幅減少在垃圾收集過程中內(nèi)存屏障的使用數(shù)量
-
內(nèi)存多重映射:
ZGC使用了多重映射(Multi-Mapping)將多個不同的虛擬內(nèi)存地址映射到同一個物理內(nèi)存地址上,這是一種多對一映射,意味著ZGC在虛擬內(nèi)存中看到的地址空間要比實際的堆內(nèi)存容量來得更大。把染色指針中的標(biāo)志位看作是地址的分段符,那只要將這些不同的地址段都映射到同一個物理內(nèi)存空間,經(jīng)過多重映射轉(zhuǎn)換后,就可以使用染色指針正常進行尋址了
ZGC收集器是如何工作的:文章來源:http://www.zghlxwxcb.cn/news/detail-683749.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-683749.html
- 并發(fā)標(biāo)記(Concurrent Mark):與G1、Shenandoah一樣,并發(fā)標(biāo)記是遍歷對象圖做可達性分析的階段,前后也要經(jīng)過類似于G1、Shenandoah的初始標(biāo)記、最終標(biāo)記(盡管ZGC中的名字不叫這些)的短暫停頓,ZGC的標(biāo)記是在指針上而不是在對象上進行的,標(biāo)記階段會更新染色指針中的Marked 0、Marked 1標(biāo)志位
- 并發(fā)預(yù)備重分配(Concurrent Prepare for Relocate):這個階段需要根據(jù)特定的查詢條件統(tǒng)計得出本次收集過程要清理哪些Region,將這些Region組成重分配集(Relocation Set)。
- ·并發(fā)重分配(Concurrent Relocate):重分配是ZGC執(zhí)行過程中的核心階段,這個過程要把重分配集中的存活對象復(fù)制到新的Region上,并為重分配集中的每個Region維護一個轉(zhuǎn)發(fā)表(ForwardTable),記錄從舊對象到新對象的轉(zhuǎn)向關(guān)系。
-
并發(fā)重映射(Concurrent Remap):重映射所做的就是**
修正整個堆中指向重分配集中舊對象的所有引用
,但是ZGC中對象引用存在“自愈”功能,所以這個重映射操作并不是很迫切。ZGC很巧妙地把并發(fā)重映射階段要做的工作,合并到了下一次垃圾收集循環(huán)中的并發(fā)標(biāo)記階段里去完成
,反正它們都是要遍歷所有對象的,這樣合并就節(jié)省了一次遍歷對象圖的開銷。
**
到了這里,關(guān)于JVM ZGC垃圾收集器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!