原创

ZGC介绍

什么是ZGC

ZGC收集器(Z Garbage Collector)由Oracle公司研发.2018年提交了JEP 333将ZGC提交给了OpenJDK,推动进入OpenJDK11的发布清单中。ZGC收集器是基于Region内存布局,暂时不设分代,使用读屏障,着色指针和内存多重映射等技术来实现并发的标记整理算法,以低延迟为目标的一款收集器。

目标

在对吞吐量影响不大的情况下,对任意大小堆收集停顿时间都控制在10ms以内的低延迟。

ZGC堆内存布局

  • 与G1一样,ZGC也采用基于Region的堆内存布局
  • ZGC的Region具有动态性
  • 动态的创建和销毁
  • 动态的Region容量大小
image.png

大小分类:

  • 小型Region(Small Region),固定大小2MB,存放小于256KB的小对象
  • 中型Region(Medium Region),固定大小32MB,存放大于256KB小于4MB的对象
  • 大型Region(Large Region),大小不固定,可以动态变化,但必须是2MB的整数倍,用于放大于4MB的大对象,每个大型Region只会放一个大对象,所以实际容量可能会小于中型Region,最小到4MB。大型RegionZGC实现中不会被重分配,因为复制一个大对象代价太高。

着色指针

着色指针是一种直接将少量额外的信息存储在指针上的技术。目前在Linux下64位的操作系统中高18位是不能用来寻址的,但是剩余的46位却可以支持64T的空间,到目前为止我们几乎还用不到这么多内存。于是ZGC将46位中的高4位取出,用来存储4个标志位,剩余的42位可以支持4TB(2的42次幂)的内存,也直接导致ZGC可以管理的内存不超过4TB,如图所示:

img
  • Marked0/marked1: 判断对象是否已标记
  • Remapped: 判断应用是否已指向新的地址
  • Finalizable: 判断对象是否只能被Finalizer访问

这几个bits在不同的状态也就代表这个引用的不同颜色

对象标记过程就是打个三色标记,这些标记本质上只和对象引用有关,和对象本身无关。某个对象只有它的引用关系才能决定它的存活。

ZGC使用了内存多重映射(Multi-Mapping)将多个不同的虚拟内存地址映射到同一个物理内存地址上,这是一种多对一映射。因为染色指针只是重新定义内存中某些指针的其中几位,OS又不支持,OS只会把整个指针当做一个内存地址来对待,只是它自己瞎想,为了解决这个问题,使用了现代处理器的虚拟内存映射技术

读屏障

比如在 ZGC 中,会对加载的引用进行测试,查看是否设置了某些位(查看着色指针,是“bad color”还是“good color”),如果是“bad color”,要走“slow path”,并执行特定的操作(比如mark、relocate、remap 等操作),将“bad color ”转变为“good color”,这样一来,下次load 时就可以走“fast path”了。

ZGC回收流程

初始标记(STW)

image-20201127165612108

停止用户线程,标记GC Root对象. 1 , 2, 4被标记为存活对象。

并发标记

image-20201127171100718

并发递归从GC Root开始遍历可达对象。5,8被标记为存活对象

移动对象

image-20201127171211328

对比发现3,6,7是过期的对象,中间灰色的Region需要被清理压缩,所以将4,5,8移动到右边空的Region,移动过程中有个forward table记录这种转变。

修正指针

image-20201127171524746

由于4,5,8发生了移动,所以需要修正.

平台支持情况

Platform

Supported

Since

Comment

Linux/x64

ok

JDK 11

Linux/AArch64

ok

JDK 13

macOS

ok

JDK 14

Windows

ok

JDK 14

Requires Windows version 1803 (Windows 10 or Windows Server 2019) or later.

wx.jpg

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 新一代垃圾回收器ZGC的探索与实践

    很多低延迟高可用Java服务的系统可用性经常受GC停顿的困扰,作为新一代的低延迟垃圾回收器,ZGC在大内存低延迟服务的内存管理和回收方面,有着非常不错的表现。

    美团技术团队
  • 第七篇 : ZGC 垃圾收集器

    Java 11包含一个全新的垃圾收集器--ZGC,它由Oracle开发,承诺在数TB的堆上具有非常低的暂停时间。 在本文中,我们将介绍开发新GC的动机,技术概述...

    程序员果果
  • Java最新前沿技术:ZGC垃圾收集器

    ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的实验性质的垃圾收集器,它曾经设计目标包括:

    程序IT圈
  • Java 13 新功能介绍

    自从 Oracle 调整了 Java 的版本发布节奏之后,Java 版本发布越来越快,虽然都说 Java 版本任他发,我用 Java 8,不过新版本的 Java...

    未读代码
  • why哥带你看看ZGC到底是个什么鬼玩意?

    像 CMS 就是分离出一些阶段使得应用线程可以和垃圾回收线程并发,当然还有利用回收线程的并行来减少停顿的时间。

    why技术
  • Tencent Kona JDK11无暂停内存管理ZGC生产实践

    ? 腾讯大数据 JVM 团队基于 OpenJDK11 自研的 Tencent Kona JDK11,目前已将 ZGC 特性孵化成熟,性能优于 OpenJDK ...

    腾讯云中间件团队
  • 深入探究JVM之垃圾回收算法实现细节

    本篇紧接上文,主要讲解垃圾回收算法的实现细节以及对目前最前沿的低延迟GC(Shenandoah、ZGC)做个介绍。

    夜勿语
  • JDK11现存性能bug(JDK-8221393)深度解析

    这是一篇鸽了很久的博客,因为博客内容和素材早就准备差不多了,但就是一直懒得整理,今天终于下定决心终于整理出来了,这也是这个bug JDK-8221393唯一一篇...

    xindoo
  • 给Arm生态添把火,腾讯Kona JDK Arm架构优化实践

    ? ? Arm架构以其兼具性能与功耗的特点,在智能终端以及嵌入式领域得到了广泛的使用,不断扩大其影响力。而在PC端以及数据中心,之前往往是x86架构在其中发挥...

    腾源会
  • 给Arm生态添把火,腾讯Kona JDK Arm架构优化实践

    ? 前言 Arm架构以其兼具性能与功耗的特点,在智能终端以及嵌入式领域得到了广泛的使用,不断扩大其影响力。而在PC端以及数据中心,之前往往是x86架构在其中发...

    腾讯技术工程官方号
  • JDK15正式发布,划时代的ZGC同时宣布转正

    2020年9月15日,JDK15正式发布,可谓如约而至。按照Java SE的发展路线图,JDK14自此停止更新。值得注意的是JDK15并非LTS版本,Oracl...

    YourBatman
  • JDK15正式发布,划时代的ZGC同时宣布转正

    2020年9月15日,JDK15正式发布,可谓如约而至。按照Java SE的发展路线图,JDK14自此停止更新。值得注意的是JDK15并非LTS版本,Oracl...

    YourBatman
  • if (b) Atomic::inc(&_processed_buffers_mut);

    笔者在之前讲解g1 youngGC源码的中提到过关于g1写屏障和Rset(记忆集合)等相关知识点,之前限于文章长度(ps:全部介绍完博客会比较长)跳过了这个部分...

    不会飞的小鸟
  • JVM - ZGC初探

    ZGC是一款JDK 11中新加入的具有实验性质的低延迟垃圾收集器,ZGC源自于是Azul System公司开发的C4(Concurrent Continuous...

    小小工匠
  • 小师妹学JVM之:GC的垃圾回收算法

    JVM的重要性不言而喻了,如果把java的应用程序比作一辆跑车,那么JVM就是这辆车的发动机,没有它,java程序就成了空中楼阁,无根浮萍。而在JVM中有一块内...

    程序那些事
  • 深入理解JVM(③)ZGC收集器

    ZGC是一款在JDK11中新加入的具有实验性质的低延迟垃圾收集器,目前仅支持Linux/x86-64。ZGC收集器是一款基于Region内存布局的,(暂时)不设...

    纪莫
  • 技术 | 那些年,我们错过的Java新特性

    2017年8月起,JCP执行委员将Java的发布频率改为每六个月一次,且每三年一个大的稳定版本。

    程序员鱼皮
  • Java 13 明天发布,最新最全新特性解读

    2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次,新的发布周期严格遵循时间点,将在每年的3月份和9月份发布。

    IT大咖说
  • 深入理解JVM - ZGC垃圾收集器

    如果下面的一些概念有些不清楚的可以先看深入理解JVM - 垃圾收集器和深入理解JVM - Shenandoah垃圾收集器。

    会呼吸的Coder

扫码关注云+社区

领取腾讯云代金券