• 新一代垃圾回收器—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背后的设计思路。

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

  • 相关阅读:
    Git 的内部工作原理
    Python中位运算符的用法
    8款好用的电脑监控软件分享
    PDE 中的先验估计是什么意思?
    网络安全专业应该从事哪个方向前景比较好。。?
    Java 基础三:使用Velocity模板生成 xml
    STM32 PWM配置及呼吸灯
    Vue Router 刷新当前页面
    批量替换网站程序中的gotoip域名
    vue vue3开发 vue2和vue3的选择
  • 原文地址:https://blog.csdn.net/wangyongfei5000/article/details/125631762