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