前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ZGC介绍

ZGC介绍

原创
作者头像
开源日记
修改2020-12-08 10:19:52
1.7K0
修改2020-12-08 10:19:52
举报
文章被收录于专栏:JVMGC

什么是ZGC

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

目标

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

ZGC堆内存布局

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

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

并发标记

image-20201127171100718
image-20201127171100718

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

移动对象

image-20201127171211328
image-20201127171211328

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

修正指针

image-20201127171524746
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
wx.jpg

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是ZGC
  • 目标
  • ZGC堆内存布局
  • 着色指针
  • 读屏障
  • ZGC回收流程
    • 初始标记(STW)
      • 并发标记
        • 移动对象
          • 修正指针
          • 平台支持情况
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档