堆之大,ZGC亦可速清也!
“?鯤之大,不知其幾千里也;堆之大,ZGC亦可速清也。”
1、什么是ZGC
ZGC(Z Garbage Collector) 是一款在JDK 11引入的低延遲垃圾收集器,并在之后的JDK版本里被持續優化,官方聲稱具有以下四大特性:
支持TB級別的內存
最大GC延遲時間在10ms內(在JDK 16中這一數值達到了1ms)
應用程序吞吐量最多減少15%
為未來的GC新特性奠定基礎
下面的內容會先對ZGC做一個詳細介紹,然后逐一說明這四大特性背后是如何實現的
2、內存布局
與G1一樣,ZGC也采用基于Region的堆內存布局,不一樣的是ZGC的Region具有動態性:動態創建銷毀、動態容量大小
一共分為三種Region:
小型Region:容量固定為 2MB,存放小于256KB的對象
中型Region:容量固定為 32MB,存放大于256KB小于4MB的對象
大型Region:容量為 2*N MB,可以動態變化,每個大Region中只會存放一個大對象,并且不會被重分配(即后文介紹的對象的復制),因為大對象的復制代價高昂
下圖為ZGC的堆內存布局
3、GC信息存儲
1.?傳統方式
對象實例在堆內存有一部分數據是對象頭,對象頭由Mark Word,指向類的指針和數組長度三部分組成。Mark Word記錄了對象和鎖相關的信息,下圖是其在64位JVM下的存儲結構。
可以看到分代年齡、GC標記這種GC相關的信息被存儲在對象頭中,這種方式在有對象訪問的情況下是很自然合理的,但是對象在內存中會因為GC的原因經常被移動,會有訪問失敗的可能。我們知道訪問內存中的對象是通過指針來訪問的,那么這種GC相關的信息是否可以存儲在指針上呢?畢竟指針相較于對象穩定多了。
2. 染色指針
染色指針是一種直接將少量額外的信息存儲在指針上的技術,具體信息在64位平臺中如下圖所示
Unused(18 bits):用來給未來的GC新特性預留的擴展點
Finalizable(1 bits):標記該對象是否將要被回收
Marked1&Marked0(各1 bits):用于標記對象
Object Address(42 bits):可管理的內存為4TB (2的42次冪)
3.?內存屏障
染色指針如何能夠生效,內存屏障是很關鍵的一項技術。簡而言之就是從堆中加載類引用的時候執行的一段額外邏輯,是不是有一點AOP的味道?
下圖則是內存屏障相關的邏輯,有一些內容會在本文后面介紹到。
4、執行過程
ZGC的執行過程可分為以下四個大階段,這四個階段都是可以并行的
1. 并發標記(Concurrent Mark)
從GC ROOTS遍歷對象圖做可達性分析
2. 并發預備重分配(Concurrent Prepare for Relocate)
統計本次需要清理哪些Region,將這些Region組成重分配集(Relocation Set)
3. 并發重分配(Concurrent?Relocate)
這個階段會把重分配集(Relocation Set)中存活的對象復制到新的Region中,并為每個Region維護一個轉發表(Forward Table),記錄從舊對象到新對象的轉向關系。由于染色指針的特性,僅從引用就可得知一個對象是否處于重分配集中(Remapped 標記),這次訪問會被內存屏障截獲,根據轉發表中新的對象地址進行訪問,并修正更新引用的值,使其指向新對象。這是指針的自愈(Self-Healing)能力,只有第一次訪問舊對象會被轉發,僅會被影響一次。
清理后的Region可以立即釋放用于新對象的分配,不用擔心很多指向舊對象的指針還未更新(圖中紅色箭頭),舊對象的指針訪問對象的時候會被轉發表路由到新的對象。
是不是很像你去訪問一個老朋友(舊對象),但是老朋友搬家了(內存復制),但是家門口(轉發表)寫著新家的地址。
4. 并發重映射(Concurrent?Remap)
重映射就是修正整個堆中舊對象的所有引用,但是由于自愈能力的存在,這個階段并不緊迫,所以這個階段通常伴隨著下一次垃圾收集循環的并發標記(Concurrent Mark)階段執行了,反正都是要遍歷對象圖,這樣節省一次遍歷。一旦所有指針都被修正后,記錄新舊對象的轉發表就可以釋放了
5、總結
最后再來看官方聲稱的四大特性分別是如何做到的
支持TB級別的內存:Region分區管理、染色指針尋址
最大GC延遲時間在10ms內:全并發處理(僅對GC ROOTS進行遍歷時會暫停)
應用程序吞吐量最多減少15%:當生命周期很短的對象分配速率很高的時候,大量對象不會被進行標記收集,會產生大量浮動垃圾從而影響吞吐量,并且堆中可轉移對象的空間就會越來越小
為未來的GC新特性奠定基礎:染色指針中未被使用的18 bits
?OpenJDK?wiki?
《The?Z?Garbage?Collector?Low?Latency?GC?
for?OpenJDK》?
《The?Z?Garbage?Collector?An?Introduction》?
《An?Introduction?to?ZGC:?
A?Scalable?and?Experimental?Low-Latency?JVM?Garbage?Collector》?
《深入理解Java虛擬機》第三版
本文來自我們團隊的一個應屆生的文章,寫的不錯,他的公眾號大家也可以關注下:
有道無術,術可成;有術無道,止于術
歡迎大家關注Java之道公眾號
好文章,我在看??
總結
以上是生活随笔為你收集整理的堆之大,ZGC亦可速清也!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用fiddler进行app弱网测试
- 下一篇: 教你查看Windows 7的详细系统版本