新一代垃圾回收器—ZGC

目录

1、什么是ZGC

2、ZGC设计目的

3、ZGC现状

4、ZGC的核心技术

4.1 多重映射

4.2 染色指针

4.3 读屏障


1、什么是ZGC

ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的实验性质的垃圾收集器。

ZGC是最近由Oracle为OpenJDK开源的新垃圾收集器。它主要由Per Liden编写。ZGC类似于Shenandoah或Azul的C4,专注于减少暂停时间的同时仍然压缩堆。

2、ZGC设计目的

ZGC的核心是一个并发垃圾回收器,其设计的目标是:

1)  停顿时间不超过10ms;

2)  停顿时间不会随着堆的大小,或者活跃对象的大小而增加;

3)  支持堆范围为8MB~4TB级别(未来支持16TB)。

总之, ZGC的目的就是在减少暂停时间的同时,仍然能压缩堆。

3、ZGC现状

基于最新的JDK15来看,“停顿时间不超过10ms”和“支持16TB的堆”这两个目标已经实现,并且官方明确指出JDK15中的ZGC不再是实验性质的垃圾收集器,而且建议投入生产了。

4、ZGC的核心技

4.1 多重映射

先来看一个很有意思的例子。

你在你爸爸妈妈眼中是儿子,在你女朋友眼中是男朋友。在全世界人面前就是最帅的人。你还有一个名字,但名字也只是你的一个代号,并不是你本人。假如你的名字是全世界唯一的,通过“你的名字”、“你爸爸的儿子”、“你女朋友的男朋友”,“世界上最帅的人”最后定位到的都是你本人。

现在我们再来看看ZGC的内存管理。

ZGC中管理物理内存的基本单位是segment。segment默认与small page size一样,都是2MB。引入segment是为了避免频繁的申请和释放内存的系统调用,一次申请2MB,当segment空闲时,将加入空闲列表,等待之后重复使用。

ZGC为了能高效、灵活地管理内存,实现了两级内存管理:虚拟内存和物理内存,并且实现了物理内存和虚拟内存的映射关系。这和操作系统中虚拟地址和物理地址设计思路基本一致。

当应用程序创建对象时,首先在堆空间申请一个虚拟地址,ZGC同时会为该对象在Marked0、Marked1和Remapped三个视图空间分别申请一个虚拟地址,且这三个虚拟地址对应同一个物理地址。

在ZGC中这三个空间在同一时间点有且仅有一个空间有效。

为什么这么设计呢?

这就是ZGC的高明之处,利用虚拟空间换时间

这三个空间的切换是由垃圾回收的不同阶段触发的,通过限定三个空间在同一时间点有且仅有一个空间有效高效的完成GC过程的并发操作,这个和ZGC并发处理算法有关系。ZGC并发处理算法利用全局空间视图的切换和对象地址视图的切换,结合SATB算法实现了高效的并发。

4.2 染色指针

我们都知道,之前的垃圾收集器都是把GC信息(标记信息、GC分代年龄..)存在对象头的Mark Word里。

而ZGC是这样做的:

如果某个对象是垃圾对象。就在这对象的信息里面标注这个对象是个垃圾。以后不管这个对象在哪儿使用,都知道他是个垃圾对象。

ZGC将对象信息存储在指针中,这种技术叫做——染色指针(Colored Pointer)。

在64位的机器中,对象指针是64位的。

ZGC使用64位地址空间的第0~43位存储对象地址,2^44 = 16TB,所以ZGC最大支持16TB的堆。

而第44~47位作为颜色标志位,Marked0、Marked1和Remapped代表三个视图标志位,Finalizable表示这个对象只能通过finalizer才能访问。

第48~63位固定为0没有利用。

4.3 读屏障

读屏障是JVM向应用代码插入一小段代码的技术。当应用线程从堆中读取对象引用时,就会执行这段代码。不要把这个读屏障和Java内存模型里面的读屏障搞混了,两者根本不是同一个东西,ZGC中的读屏障更像是一种AOP技术,在字节码层面或者编译代码层面给读操作增加一个额外的处理。

ZGC作为一款优秀垃圾收集器了,其借鉴了Pauseless GC,但在G1都没有普及的今天,谈论ZGC似乎为时过早。但也许我们探讨的不是ZGC,而是ZGC背后的设计思路。

关注公众号 + 输入[面试题] + 免费领取面试资料(面试大纲+面试答案)!  

猜你喜欢

转载自blog.csdn.net/wangyongfei5000/article/details/125631762