探秘ZGC

news/2024/11/28 10:50:17/

ZGC(The Z Garbage Collector)是JDK 11中推出的一款低延迟垃圾回收器,目前处于试验阶段,它的优势包括:

  • 停顿时间不超过10ms,可以在KB~TB的工作范围下进行垃圾回收;
  • 停顿时间不会随着堆的大小,或者活跃对象的大小而增加;
  • 支持8MB~4TB级别的堆(未来支持16TB)
为什么要引入ZGC

众所周知在一些高性能低延迟的应用中,GC往往是应用的瓶颈,因为在GC期间会发生STW(Stop The World),当STW时,所有应用线程停止活动,等待GC停顿结束。在一些对响应时间比较苛刻的系统中,GC往往是非常难优化的一点,这也是为什么垃圾收集器在不断演进的一个重要原因。

ZGC保证,不管在什么情况下,延迟不会超过10毫秒。

The Z Garbage Collector, also known as ZGC, is a scalable low latency garbage collector designed to meet the following goals:

  • Pause times do not exceed 10ms
  • Pause times do not increase with the heap or live-set size
  • Handle heaps ranging from a few hundred megabytes to multi terabytes in size

现对于CMS和G1的GC过程以及停顿时间的瓶颈,全局并发的ZGC(标记、转移和重定位阶段几乎都是并发的)显然是一个更好的选择。

ZGC的特点

ZGC最典型的特性是它是一款并发(concurrent)的GC,其它的特性如下:

  • 它可以标记内存,复制和迁移(relocate)内存,所有的操作都是并发的,同时它有一个并发的引用处理器

  • 其它的垃圾收集器都是使用store barriers,ZGC使用load barriers,用于跟踪内存

    • lock->unlock->read->load 读内存
    • use->assign->store->write 写内存
  • ZGC可以更加灵活的配置大小和策略,相比于G1,它可以更好的处理非常大(very large)对象的释放

  • ZGC只有一代,没有新生代,老年代什么的,但是ZGC可以支持局部压缩,在内存恢复和迁移(reclaim and relocate)时,ZGC仍然有很高的性能

  • ZGC依赖NUMA-aware(非均衡存储器访问),需要我们的内存支持这种特点

ZGC堆内存布局
  • 与G1一样,ZGC也采用基于Region的堆内存布局

  • ZGC的Region具有动态性

  • 动态的创建和销毁

  • 动态的Region容量大小
    在这里插入图片描述
    大小分类:

  • 小型Region(Small Region):固定大小2MB,存放小于256KB的小对象

  • 中型Region(Medium Region):固定大小32MB,存放大于256KB小于4MB的对象

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

ZGC的着色指针技术

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

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

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

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

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

ZGC的读屏障技术

读屏障是JVM向应用代码插入一小段代码的技术。当应用线程从堆中读取对象引用时,就会执行这段代码。需要注意的是,仅“从堆中读取对象引用”才会触发这段代码。

ZGC回收流程

在这里插入图片描述
我们将上图进行拆解来理解

  • 初始标记(STW)

在这里插入图片描述
停止用户线程,标记GC Root对象. 1、2、4被标记为存活对象。

  • 并发标记

在这里插入图片描述
并发递归从GC Root开始遍历可达对象,5、8被标记为存活对象。

  • 移动对象

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

  • 修正指针

在这里插入图片描述
由于4、5、8发生了移动,所以需要修正。

总结
  • ZGC作为下一代垃圾回收器,性能非常优秀。ZGC垃圾回收过程几乎全部是并发,实际STW停顿时间极短,不到10ms。这得益于其采用的着色指针和读屏障技术。
  • ZGC不是“银弹”,需要根据服务的具体特点进行调优,并且需要支持NUMA-aware(非均衡存储器访问),需要我们的内存支持这种特点。所以还是要根据公司业务的需求和实际情况来权衡。
参考链接
  • https://tech.meituan.com/2020/08/06/new-zgc-practice-in-meituan.html
  • https://www.baeldung.com/jvm-zgc-garbage-collector
  • https://hub.packtpub.com/getting-started-with-z-garbage-collectorzgc-in-java-11-tutorial/

http://www.ppmy.cn/news/865242.html

相关文章

什么是chatgpt?丨小智AI

什么是chatgpt? ChatGPT是一种大型语言模型,由OpenAI开发。它是建立在GPT-3.5架构上的,可以进行自然语言处理和生成,包括文本分析、问答、文本生成等多种任务。ChatGPT通过学习海量的语言数据,并使用深度神经网络进行…

ZGC学习笔记:ZGC简介和JDK17对ZGC的优化

00 前情提要 不行了,之前还没写几篇文章,本来想保持住那种非常认真非常严谨的风格,保持不住了~ 反正工作时候还不是遇到问题,先google,google不到再百度一下。解决不了就向同事卖萌啦~ 这图我实在找不到更高清的了&…

小智一分钟带你搭建个人网站

前言: 这是小编在学习网页的时候,使用ISS配置服务器,写的一些总结,希望对大家有所帮助! 简介: 首先介绍一下ISS,ISS是Internet Information Services的缩写,意为互联网信息服务,是微软公司提供的基于运行Microsoft Windows的互联网基本服务。ISS是一种Web(网页)服…

勒索病毒.[tsai.shen@mailfence.com].faust、.[support2022@cock.li].faust引起的数据被加密恢复

勒索病毒的危害 勒索病毒是最具破坏性和恐怖性的一种病毒。最近[tsai.shen@mailfence.com].faust勒索病毒、.[support2022@cock.li].faust勒索病毒引起了广泛的关注和担忧。 如果您的数据已被勒索软件加密,恢复数据的最可靠方法是使用备份。如果您有备份,可以将备份文件恢复…

P8195 [传智杯 #4 决赛] 小智的疑惑

传智专修学院给了小智一个仅包含小写字母的字符串 ss,他想知道,里面出现了多少次子串 chuanzhi 呢。 我们称一个字符串 t是 s 的子串,当且仅当将 s 的开头若干个(可以为 0 个)连续字符和结尾若干个(可以为 …

小智-微直播 使用教程

http://v.youku.com/v_show/id_XMjUzMTc1NDI1Ng.html

我在优酷 OTT 端做自动化制图

作者 | 阿里文娱高级前端开发工程师-罄天 责编 | 杨碧玉 头图 | CSDN 下载自视觉中国 背景 图片作为网页中的重要组成元素,广泛存在于各种站点中,有些站点中的图片内容已经远远超过了其它网页内容总和。如何高效的、快速的制作业务图片就被广泛的提出来…

应用程序的执行 第 4 章 Spark 任务调度机制

应用程序的执行 && 第 4 章 Spark 任务调度机制 应用程序的执行(1) RDD 依赖shuffledRDDShuffleDependencyMapPartitionRDDOneToOneDependency (2) 阶段的划分shuffledRDDRDDShuffleMapStageResultStage (3) 任务的切分(4) 任务的调度TaskTaskPool (5) 任务的执行Task…