当前位置: 首页 > news >正文

JVM ZGC垃圾收集器

ZGC垃圾收集器

ZGC(“Z”并非什么专业名词的缩写,这款收集器的名字就叫作Z Garbage Collector)是一款在JDK 11中新加入的具有实验性质[1]的低延迟垃圾收集器,是由Oracle公司研发的。

ZGC收集器是一款基于Region内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的,以低延迟为首要目标的一款垃圾收集器。

  • ZGC的Region具有动态性——动态创建和销毁,以及动态的区域容量大小。可以具有大、中、小三类容量:

    • 小型Region(Small Region):容量固定为2MB,用于放置小于256KB的小对象。

    • 中型Region(Medium Region):容量固定为32MB,用于放置大于等于256KB但小于4MB的对象。

    • 大型Region(Large Region):容量不固定,可以动态变化,但必须为2MB的整数倍,用于放置

    4MB或以上的大对象。每个大型Region中只会存放一个大对象,但它的实际容量完全有可能小于中型Region,最小容量可低至4MB。

  • 染色指针技术(Colored Pointer)

    染色指针是一种直接将少量额外的信息存储在指针上的技术。

    64位的Linux则分别支持47位(128TB)的进程虚拟地址空间和46位(64TB)的物理地址空间,64位的Windows系统甚至只支持44位(16TB)的物理地址空间。

    ZGC的染色指针技术将46位指针宽度的高4位取出来存储4个标志信息,通过这些标志位,虚拟机可以直接从指针中看到其引用对象的三色标记状态、是否进入了重分配集(即被移动过)、是否只能通过finalize()方法才能被访问到,如图3-20所示。当然,由于这些标志位进一步压缩了原本就只有46位的地址空间,也直接导致ZGC能够管理的内存不可以超过4TB(2的42次幂)。

在这里插入图片描述

三大优势:

  • 染色指针可以使得一旦某个Region的存活对象被移走之后,这个Region立即就能够被释放和重用掉,而不必等待整个堆中所有指向该Region的引用都被修正后才能清理。

  • 染色指针可以作为一种可扩展的存储结构用来记录更多与对象标记、重定位过程相关的数据,以便日后进一步提高性能。

  • 染色指针可以大幅减少在垃圾收集过程中内存屏障的使用数量

  • 内存多重映射:

    ZGC使用了多重映射(Multi-Mapping)将多个不同的虚拟内存地址映射到同一个物理内存地址上,这是一种多对一映射,意味着ZGC在虚拟内存中看到的地址空间要比实际的堆内存容量来得更大。把染色指针中的标志位看作是地址的分段符,那只要将这些不同的地址段都映射到同一个物理内存空间,经过多重映射转换后,就可以使用染色指针正常进行寻址了

    在这里插入图片描述

ZGC收集器是如何工作的:

在这里插入图片描述

  • 并发标记(Concurrent Mark):与G1、Shenandoah一样,并发标记是遍历对象图做可达性分析的阶段,前后也要经过类似于G1、Shenandoah的初始标记、最终标记(尽管ZGC中的名字不叫这些)的短暂停顿,ZGC的标记是在指针上而不是在对象上进行的,标记阶段会更新染色指针中的Marked 0、Marked 1标志位
  • 并发预备重分配(Concurrent Prepare for Relocate):这个阶段需要根据特定的查询条件统计得出本次收集过程要清理哪些Region,将这些Region组成重分配集(Relocation Set)。
  • ·并发重分配(Concurrent Relocate):重分配是ZGC执行过程中的核心阶段,这个过程要把重分配集中的存活对象复制到新的Region上,并为重分配集中的每个Region维护一个转发表(ForwardTable),记录从旧对象到新对象的转向关系。
  • 并发重映射(Concurrent Remap):重映射所做的就是**修正整个堆中指向重分配集中旧对象的所有引用,但是ZGC中对象引用存在“自愈”功能,所以这个重映射操作并不是很迫切。ZGC很巧妙地把并发重映射阶段要做的工作,合并到了下一次垃圾收集循环中的并发标记阶段里去完成,反正它们都是要遍历所有对象的,这样合并就节省了一次遍历对象图的开销。**
http://www.lryc.cn/news/146820.html

相关文章:

  • 事务管理-事务进阶-propagation属性
  • 树多选搜索查询,搜索后选中状态仍保留
  • 数据结构--字典树(trie)
  • iframe通过postMessage进行跨域通信以及在Angular中使用
  • rust学习-引用C库
  • WebAssembly 在云原生中的实践指南
  • Azure sqlserver 更改字符集
  • git push时,由于commit了大文件无法成功push的解决办法
  • 2023_Spark_实验一:Windows中基础环境安装
  • 如何在Windows / Mac / iPhone / Android / Online上将MP4转换为MP3
  • 【App端】uni-app使用百度地图api和echarts省市地图下钻
  • 深度学习(十)--- cv2.pointPolygonTest() 判断一点是否在指定区域内
  • 后端面试话术集锦第 八 篇:redis面试话术
  • LiteOS qemu realview-pbx-a9 环境搭建与运行
  • Kubernetes技术--Kubernetes架构组件以及核心概念
  • 拿来即用修改密码功能
  • 违背原则才能写好代码(一)
  • 面试官眼中的理想候选人:如何成为他们的首选
  • ES6中的扩展运算符你真的会用吗?
  • 利用逻辑回归判断病人肺部是否发生病变
  • 全民健康生活方式行动日,天猫健康联合三诺生物推出“15天持续测糖计划”
  • 设计模式行为型-状态模式
  • 弹窗、抽屉、页面跳转区别 | web交互入门
  • 说说Flink运行模式
  • 视频汇聚/视频云存储/视频监控管理平台EasyCVR新增首次登录强制修改密码
  • C语言控制语句——分支语句
  • 音视频 fmpeg命令裁剪和合并视频
  • 机器学习基础17-基于波士顿房价(Boston House Price)数据集训练模型的整个过程讲解
  • 哈希的应用——布隆过滤器
  • LNMT的多机部署和双机热备