JVM ZGC介绍

字节探索
• 阅读 1241

什么是ZGC

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

目标

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

ZGC堆内存布局

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

JVM ZGC介绍

大小分类:

  • 小型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,如图所示:

JVM ZGC介绍

  • 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)

JVM ZGC介绍

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

并发标记

JVM ZGC介绍

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

移动对象

JVM ZGC介绍

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

修正指针

JVM ZGC介绍

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

平台支持情况

PlatformSupportedSinceComment
Linux/x64okJDK 11
Linux/AArch64okJDK 13
macOSokJDK 14
WindowsokJDK 14Requires Windows version 1803 \(Windows 10 or Windows Server 2019\) or later\.

JVM ZGC介绍

点赞
收藏
评论区
推荐文章
从历代GC算法角度刨析ZGC
本文所有介绍仅限于HotSpot虚拟机,本文先介绍了垃圾回收的必要手段,基于这些手段讲解了历代垃圾回收算法是如何工作的,每一种算法不会讲的特别详细,只为读者从算法角度理解工作原理,从而引出ZGC,方便读者循序渐进地了解。
从原理聊JVM(三):详解现代垃圾回收器Shenandoah和ZGC | 京东云技术团队
现代的垃圾回收器为了低停顿的目标可谓将“并发”二字玩到极致,Shenandoah在G1基础上做了非常多的优化来使回收阶段并行,而ZGC直接采用了染色指针、NUMA等黑科技,目的都是为了让Java开发者可以更多的将精力放在如何使用对象让程序更好的运行,剩下的一切交给GC,我们所做的只需享受现代化GC技术带来的良好体验。
Wesley13 Wesley13
3年前
java 虚拟机 收集器 总结
java虚拟机收集器总结|垃圾收集器|新生代|老年代|jvm参
从原理聊JVM(一):染色标记和垃圾回收算法
本篇介绍了JVM中垃圾回收器相关的基础知识,后续会深入介绍CMS、G1、ZGC等不同垃圾收集器的运作流程和原理,欢迎关注。
Wesley13 Wesley13
3年前
JDK 11 ZGC实现简介
JDK11ZGC简介注1:本文翻译自这篇文章(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fdinfuehr.github.io%2Fblog%2Fafirstlookintozgc%2F)注2:我有了新的独立博客地址(https://
Wesley13 Wesley13
3年前
Java9之后的模块化烦恼解决(由RocketMQ升级OpenJDK11想到的)
本文基于OpenJDK11最近从OpenJDK8升级到了OpenJDK11,系统业务MQ用的RocketMQ,升级RocketMQ过程中,在已修改好JVM参数的情况下(参考我另一篇文章),遇到如下异常:java.lang.IllegalStateException:java.lang.reflect.InaccessibleObject
Stella981 Stella981
3年前
OpenJDK 11 JVM日志相关参数解析与使用
OpenJDK11是在OpenJDK8之后的第一个长期支持版本,这一版本在JVM日志配置有了很大改动,主要是规范化,统一化了。在OpenJDK8中,日志配置有很多状态位,让人摸不着头脑,并且比较难以维护与进一步迭代。在OpenJDK11终于将JVM日志相关的配置规范起来,统一配置。这篇文章会对于这些配置做一个基本的说明和解析。一、JV
Stella981 Stella981
3年前
JVM系列篇:7种JVM垃圾收集器特点,优劣势、及使用场景
本系列会持续更新。!(https://oscimg.oschina.net/oscnet/945dbe48630eb4284fea936b19161c0f08a.jpg)今天继续JVM的垃圾回收器详解,如果说垃圾收集算法是JVM内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。一、常见的垃圾收集器
OpenJDK17-JVM源码阅读-ZGC-并发标记 | 京东物流技术团队
1、ZGC简介1.1介绍ZGC是一款低延迟的垃圾回收器,是Java垃圾收集技术的最前沿,理解了ZGC,那么便可以说理解了java最前沿的垃圾收集技术。从JDK11中作为试验特性推出以来,ZGC一直在不停地发展中。从JDK14开始,ZGC开始支持Window
JDK11升级JDK17最全实践干货来了 | 京东云技术团队
从JDK11到JDK17,到底带来了哪些特性呢?亚毫秒级的ZGC效果到底怎么样呢?值得我们升级吗?而且升级过程会遇到哪些问题呢?带着这些问题,本篇文章将带来完整的JDK11升级JDK17最全实践。
京东云开发者 京东云开发者
2星期前
JDK从8升级到21的问题集
作者:京东工业韦付芝一、背景与挑战1.升级动因◦Oracle长期支持策略◦现代特性需求:协程、模式匹配、ZGC等◦安全性与性能的需求◦AI新技术引入的版本要求2.项目情况◦100项目并行升级的协同作战◦多技术栈并存◦持续集成体系的适配挑战二、进度|应用总
字节探索
字节探索
Lv1
千里黄云白日曛,北风吹雁雪纷纷。
文章
4
粉丝
0
获赞
0