A FIRST LOOK INTO ZGC
概述
- ZGC類似於shennadoash或者C4,專注於減少暫停時間和壓縮堆
- 減少暫停時間的方法
- GC可以在並行壓縮時使用多個執行緒
- 壓縮工作分為多個暫停(增量壓縮)
- 將堆緊密地壓縮到正在執行的應用程式而不停止它(併發壓縮)
- Go的gc只是通過不壓縮堆來處理
GC barrier
ZGC併發壓縮的關鍵是load barrier/read barrier
- 如果gc具有load barrier,則從堆讀取引用時,需要執行一些額外操作。Java中對於obj.field,gc都要write/store barrier
- 因為堆中的讀取和寫入很常見,所以gc的write barrier和read barrier都需要非常高效,read barrier比write barrier更加容易,因此read barrier對效能更加敏感,分代gc需要一個write barrier,不需要read barrier;zgc需要一個read barrier,不需要write barrier
- 讀取/寫入類似基本型別int double不需要barrier
reference coloring
zgc在堆引用中儲存額外的後設資料,x64上是64位寬
6 4 4 4 4 4 0
3 7 6 5 2 1 0
+-------------------+-+----+-----------------------------------------------+
|00000000 00000000 0|0|1111|11 11111111 11111111 11111111 11111111 11111111|
+-------------------+-+----+-----------------------------------------------+
| | | |
| | | * 41-0 Object Offset (42-bits, 4TB address space)
| | |
| | * 45-42 Metadata Bits (4-bits) 0001 = Marked0
| | 0010 = Marked1
| | 0100 = Remapped
| | 1000 = Finalizable
| |
| * 46-46 Unused (1-bit, always zero)
|
* 63-47 Fixed (17-bits, always zero)
複製程式碼
zgc保留物件實際地址的前42位(偏移量),所以zgc限制了4TB(堆最大為4TB) 後設資料位是42-45位,finalizable remapped marked1 marked0
剩下此處在offset處分配頁面時,沒有看懂
Pages & Physical & Virtual Memory
- Shenandoah將堆分成了若干個大小相同的區域
- ZGC稱區域為頁面,ZGC將頁面劃分為大小不同的,都是2MB的倍數,有三種大小,小型(2MB),中型(32MB),大型(2MB的倍數)
- ZGC可以區分實體記憶體和虛擬記憶體,能夠將非連續的物理頁面對映到單個連續的虛擬記憶體空間。
實體記憶體和虛擬記憶體 實體記憶體就是系統硬體提供的記憶體大小,是真正的記憶體,相對於實體記憶體,在linux下還有一個虛擬記憶體的概念,虛擬記憶體就是為了滿足實體記憶體的不足而提出的策略,它是利用磁碟空間虛擬出的一塊邏輯記憶體,用作虛擬記憶體的磁碟空間被稱為交換空間(Swap Space)
標記和重新定位物件
CMS 的過程
- 初始標記
- 並行標記
- 重新標記
- 並行清除
G1收集器的過程
ZGC收集器的過程
- 初始停頓標記
- 併發標記(concurrent mark)
- 移動物件(relocate)
- 修正指標(remap)
ZGC的優點是隻需要為重定位集中的頁面為轉發指標分配空間,相比之下,shenandoah將轉發指標儲存在物件本身中,用於每個物件,這些物件具有一些開銷