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将转发指针存储在对象本身中,用于每个对象,这些对象具有一些开销