JVM之垃圾回收器ZGC概述以及垃圾回收器总结的详细解析 ...

饭宝  论坛元老 | 2025-1-15 10:42:44 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1027|帖子 1027|积分 3081

ZGC

ZGC 网络器是一个可伸缩的、低延迟的垃圾网络器,基于 Region 内存布局的,不设分代,使用了读屏蔽、染色指针和内存多重映射等技术来实现可并发的标记压缩算法


  • 在 CMS 和 G1 中都用到了写屏蔽,而 ZGC 用到了读屏蔽
  • 染色指针:直接将少量额外的信息存储在指针上的技术,从 64 位的指针中拿高 4 位来标识对象此时的状态

    • 染色指针可以使某个 Region 的存活对象被移走之后,这个 Region 立刻就可以大概被开释和重用
    • 可以直接从指针中看到引用对象的三色标记状态(Marked0、Marked1)、是否进入了重分配集、是否被移动过(Remapped)、是否只能通过 finalize() 方法才能被访问到(Finalizable)
    • 可以大幅减少在垃圾网络过程中内存屏蔽的使用数量,写屏蔽的目的通常是为了记录对象引用的变更环境,如果将这些信息直接维护在指针中,显然就可以省去一些专门的记录操纵
    • 可以作为一种可扩展的存储结构用来记录更多与对象标记、重定位过程相关的数据

  • 内存多重映射:多个虚拟地址指向同一个物理地址
可并发的标记压缩算法:染色指针标识对象是否被标记或移动,读屏蔽保证在每次应用程序或 GC 程序访问对象时先根据染色指针的标识判定是否被移动,如果被移动就根据转发表访问新的移动对象,并更新引用,不会像 G1 一样必须等候垃圾回收完成才能访问
ZGC 目标:


  • 停顿时间不会凌驾 10ms
  • 停顿时间不会随着堆的增大而增大(不管多大的堆都能保持在 10ms 以下)
  • 可支持几百 M,甚至几 T 的堆大小(最大支持4T)
ZGC 的工作过程可以分为 4 个阶段:


  • 并发标记(Concurrent Mark): 遍历对象图做可达性分析的阶段,也要经过初始标记和终极标记,需要短暂停顿
  • 并发预备重分配(Concurrent Prepare for Relocate):根据特定的查询条件统计得出本次网络过程要清理哪些 Region,将这些 Region 组成重分配集(Relocation Set)
  • 并发重分配(Concurrent Relocate): 重分配是 ZGC 实行过程中的核心阶段,这个过程要把重分配集中的存活对象复制到新的 Region 上,并为重分配集中的每个 Region 维护一个转发表(Forward Table),记录从旧地址到新地址的转向关系
  • 并发重映射(Concurrent Remap):修正整个堆中指向重分配集中旧对象的所有引用,ZGC 的并发映射并不是一个必须要立刻完成的任务,ZGC 很奥妙地把并发重映射阶段要做的工作,合并到下一次垃圾网络循环中的并发标记阶段里去完成,由于都是要遍历所有对象,如许合并节省了一次遍历的开销
ZGC 几乎在所有地方并发实行的,除了初始标记的是 STW 的,但这部门的实际时间是非常少的,所以响应速度快,在尽大概对吞吐量影响不大的前提下,实现在恣意堆内存大小下都可以把垃圾网络的停顿时间限定在十毫秒以内的低延迟
优点:高吞吐量、低延迟
缺点:浮动垃圾,当 ZGC 预备要对一个很大的堆做一次完整的并发网络,其全过程要持续十分钟以上,由于应用的对象分配速率很高,将创造大量的新对象产生浮动垃圾
参考文章:深入理解JVM(③)ZGC网络器 - 纪莫 - 博客园


总结

Serial GC、Parallel GC、Concurrent Mark Sweep GC 这三个 GC 差别:


  • 最小化地使用内存和并行开销,选 Serial GC
  • 最大化应用程序的吞吐量,选 Parallel GC
  • 最小化 GC 的停止或停顿时间,选 CMS GC




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

饭宝

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表