ZGC这个垃圾收集器的工作流程:

ZGC 的运作过程大致可划分为以下四个大的阶 段。全部四个阶段都是可以并发执行的,仅是两个阶段中间会存在短暂的停顿小阶段。

并发标记(Concurrent Mark

与G1、Shenandoah一样,并发标记是遍历对象图做可达性分析的 阶段,前后也要经过类似于G1、Shenandoah的初始标记、最终标记(尽管ZGC中的名字不叫这些)的 短暂停顿,而且这些停顿阶段所做的事情在目标上也是相类似的。与G1、Shenandoah不同的是,ZGC的标记是在指针上而不是在对象上进行的,标记阶段会更新染色指针中的Marked 0、Marked 1标志 位。

并发预备重分配(Concurrent Prepare for Relocate):

这个阶段需要根据特定的查询条件统计得出 本次收集过程要清理哪些Region ,将这些 Region 组成重分配集( Relocation Set )。重分配集与 G1 收集器 的回收集(Collection Set )还是有区别的, ZGC 划分 Region 的目的并非为了像 G1 那样做收益优先的增 量回收。相反, ZGC 每次回收都会扫描所有的 Region ,用范围更大的扫描成本换取省去 G1 中记忆集的 维护成本。因此,ZGC 的重分配集只是决定了里面的存活对象会被重新复制到其他的 Region 中,里面 的Region 会被释放,而并不能说回收行为就只是针对这个集合里面的 Region 进行,因为标记过程是针对 全堆的。此外,在JDK 12 的 ZGC 中开始支持的类卸载以及弱引用的处理,也是在这个阶段中完成的。

并发重分配(Concurrent Relocate):

重分配是 ZGC 执行过程中的核心阶段,这个过程要把重分 配集中的存活对象复制到新的Region 上,并为重分配集中的每个 Region 维护一个转发表( Forward Table),记录从旧对象到新对象的转向关系。得益于染色指针的支持, ZGC 收集器能仅从引用上就明 确得知一个对象是否处于重分配集之中,如果用户线程此时并发访问了位于重分配集中的对象,这次 访问将会被预置的内存屏障所截获,然后立即根据Region 上的转发表记录将访问转发到新复制的对象 上,并同时修正更新该引用的值,使其直接指向新对象,ZGC 将这种行为称为指针的 “ 自愈 ” ( Self- Healing)能力。这样做的好处是只有第一次访问旧对象会陷入转发,也就是只慢一次,对比 Shenandoah的 Brooks 转发指针,那是每次对象访问都必须付出的固定开销,简单地说就是每次都慢, 因此ZGC 对用户程序的运行时负载要比 Shenandoah 来得更低一些。还有另外一个直接的好处是由于染 色指针的存在,一旦重分配集中某个Region 的存活对象都复制完毕后,这个 Region 就可以立即释放用于 新对象的分配(但是转发表还得留着不能释放掉),哪怕堆中还有很多指向这个对象的未更新指针也 没有关系,这些旧指针一旦被使用,它们都是可以自愈的。
并发重映射 ( Concurrent Remap ):
重映射所做的就是修正整个堆中指向重分配集中旧对象的所 有引用,这一点从目标角度看是与Shenandoah并发引用更新阶段一样的,但是 ZGC 的并发重映射并不 是一个必须要“ 迫切 ” 去完成的任务,因为前面说过,即使是旧引用,它也是可以自愈的,最多只是第 一次使用时多一次转发和修正操作。重映射清理这些旧引用的主要目的是为了不变慢(还有清理结束 后可以释放转发表这样的附带收益),所以说这并不是很“ 迫切 ” 。因此, ZGC 很巧妙地把并发重映射 阶段要做的工作,合并到了下一次垃圾收集循环中的并发标记阶段里去完成,反正它们都是要遍历所 有对象的,这样合并就节省了一次遍历对象图 [9] 的开销。一旦所有指针都被修正之后,原来记录新旧 对象关系的转发表就可以释放掉了。

ZGC是如何工作的?相关推荐

  1. 运行orbslam2出现 段错误 (核心已转储)_JDK 14已发布快速预览16个新特性

    JDK 14已经于2020年3月17日如期发布.本文介绍JDK 14特性. JEP 305: instanceof的模式匹配(预览) 通过对instanceof运算符进行模式匹配来增强Java编程语言 ...

  2. Jdk14其他新特性

     JEP 343: Java打包工具(孵化项目) 引入 该特性旨在创建一个用于打包独立Java应用程序的工具.Java应用的打包和分发一直是个老大难问题.用户希望Java应用的安装和运行方式和其他应用 ...

  3. JDK 14如期发布,16个新特性快速预览

    JDK 14已经于2020年3月17日如期发布.本文介绍JDK 14特性. JEP 305: instanceof的模式匹配(预览) 通过对instanceof运算符进行模式匹配来增强Java编程语言 ...

  4. JVM:自动内存管理-垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 一.概述 Java堆和方法区这两个区域有着很显著的不确定性: 1.一个接口的多个实现类需要的内存 ...

  5. JDK14的重大更新

    一.JDK 14版本中的重大更改 1.1 Java SE 14和JDK 14中的一些更改 Switch进行了扩展,因此可以用作语句或表达式,以便两种形式都可以使用传统case ... :标签(带有直通 ...

  6. 垃圾回收器与内存分配策略

    垃圾回收器与内存分配策略 1. 前言 计数器:计数器难以解决循环引用,需要大量的额外处理才能正确工作. 可达性分析算法 在java技术栈里GC Roots包括以下几种 虚拟机栈中引用的对象 方法区中类 ...

  7. Jdk11,Jdk12的低延迟垃圾收集器ZGC

    https://wiki.openjdk.java.net/display/zgc/Main Z垃圾收集器,也称为ZGC,是一种可扩展的低延迟垃圾收集器,旨在实现以下目标: 暂停时间不超过10毫秒 暂 ...

  8. 干掉cms,zgc才是未来

    JAVA程序最爽的地方是它的GC机制,开发人员不需要关注内存申请和回收问题.同时,JAVA程序最头疼的地方也是它的GC机制,因为掌握JVM和GC调优是一件非常困难的事情.在ParallelOldGC. ...

  9. Oracle计划将ZGC项目提交给OpenJDK

    根据OpenJDK的邮件列表,来自Oracle的Per Liden提议将内部开发的Z垃圾收集器开源,并在OpenJDK创建ZGC项目. \\ 按照OpenJDK的指导原则,该项目将会托管不断开发完善的 ...

最新文章

  1. 学生系统优化(三)- -细节优化
  2. linux 进程间通信 dbus-glib【实例】详解三 数据类型和dteeth(类型签名type域)(层级结构:服务Service --> Node(对象、object) 等 )(附代码)
  3. 数字图像处理形态学运算
  4. 伪静态php配置,PHP开启伪静态配置
  5. ruby on rails 2.3+的版本不再支持cgi
  6. 小微金融的常规策略架构与流程是什么?
  7. 雅虎辉煌不再,紫色血液永存
  8. 高并发架构系列:如何解决Redis雪崩、穿透、并发等5大难题
  9. 深入了解-微信开发者工具
  10. Pytorch搭建DenseNet
  11. html用什么打开swf文件怎么打开,swf文件用什么打开,详细教您打开swf文件的操作...
  12. 网易云系列爬虫-采集歌单内歌曲热评
  13. python 管道游戏_用Python做flybird游戏
  14. matlab rtw 生成c代码,MATLAB Coder ——从MATLAB代码生成C/C++代码
  15. spring boot 搭建测试报错Whitelabel Error Page No message available
  16. 18本生物竞赛辅导书
  17. 《从0开始学微服务》模块一:入门微服务的学习笔记
  18. linux 通过lvm合并磁盘
  19. labelme jason文件批处理
  20. 蓝牙HID——将android设备变成蓝牙键盘(BluetoothHidDevice)

热门文章

  1. matlab的输入输出
  2. 动态jenkins slave
  3. python+Django搭建web服务器
  4. win10在此计算机上找不到系统映像,图文教你win10系统使用DISM修复找不到源的问题....
  5. 机器学习第一章 发展历史与背景
  6. isInterrupted() interrupt() interrupted() 方法的简单解释
  7. centos7查看oracle监听端口,CentOS 7开放及查看防火墙firewall的端口
  8. 为什么用新浪邮箱收不到Github注册的验证邮件???
  9. 投稿前如何查询期刊的审稿周期
  10. DynamoDB 小结