Java最前沿技术——ZGC
SegmentFault
共 4378字,需浏览 9分钟
·
2021-01-19 07:47
ZGC介绍
ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的实验性质的垃圾收集器,它曾经设计目标包括:
停顿时间不超过10ms; 停顿时间不会随着堆的大小,或者活跃对象的大小而增加; 支持8MB~4TB级别的堆(未来支持16TB)。
核心技术
多重映射
在你爸爸的眼中,你就是儿子; 在你女朋友的眼中,你就说男朋友; 站在全世界角度来看,你就说世界上最帅的人;
染色指针
ZGC使用64位地址空间的第0~43位存储对象地址,2^44 = 16TB,所以ZGC最大支持16TB的堆。 而第44~47位作为颜色标志位,Marked0、Marked1和Remapped代表三个视图标志位,Finalizable表示这个对象只能通过finalizer才能访问。 第48~63位固定为0没有利用。
读屏障
Object o = obj.FieldA // 从堆中读取对象引用,需要加入读屏障
Object p = o // 无需加入读屏障,因为不是从堆中读取引用
o.dosomething() // 无需加入读屏障,因为不是从堆中读取引用
int i = obj.FieldB // 无需加入读屏障,因为不是对象引用
ZGC并发处理算法
初始化阶段:ZGC初始化之后,整个内存空间的地址视图被设置为Remapped 标记阶段:当进入标记阶段时的视图转变为Marked0(以下皆简称M0)或者Marked1(以下皆简称M1) 转移阶段:从标记阶段结束进入转移阶段时的视图再次设置为Remapped
标记阶段
如果对象的地址视图是M0,说明对象是活跃的; 如果对象的地址视图是Remapped,说明对象是不活跃的,即对象所使用的内存可以被回收。
转移阶段
为何要设计M0和M1
M1:本次垃圾回收中识别的活跃对象。 M0:前一次垃圾回收的标记阶段被标记过的活跃对象,对象在转移阶段未被转移,但是在本次垃圾回收中被识别为不活跃对象。 Remapped:前一次垃圾回收的转移阶段发生转移的对象或者是被应用程序线程访问的对象,但是在本次垃圾回收中被识别为不活跃对象。
ZGC步骤
ZGC的发展
评论