提出问题:

学习过 JVM 的同学应该都知道,目前并发垃圾回收器(CMS、G1、ZGC)针对并发标记的典型处理都是初始标记、并发标记和再标记。其中初始标记和再标记需要STW(stop the world) 。大家对于初始标记需要STW都习以为常,但是有没有仔细思考一下,为什么初始标记需要STW ?能不能把初始标记和并发标记放在一起并发执行,去掉STW ?
显然答案是不能,否则垃圾回收器的设计者们早就这样做了,JVM中所有的并发垃圾回收器在并发标记时都包含这两个阶段。那么问题来了,为什么不能?在这里进行STW的目的是什么?解决的是什么问题?

作出假设:

我们先做一个假设,假设将初始标记和并发标记进行合并,并且不需要STW。逻辑上似乎可行,我们从根集合出发直接使用并发标记开始标记,直到递归完所有的活跃对象。因为是并发处理,所以标记线程和应用程序线程并发地访问对象。存在的场景有以下几种:

  • 1、只有应用程序线程访问对象。
  • 2、只有标记线程访问对象。
  • 3、标记线程和应用程序线程都访问了对象,并且应用程序线程在标记线程之后访问对象。
  • 4、标记线程和应用程序线程都访问了对象,并且应用程序线程在标记线程之前访问对象。

对于情况1:如果应用程序线程创建新的对象,按照并发处理算法的介绍,新的对象被标记为活跃的;如果程序线程访问对象,而标记线程不会访问对象,说明应用程序线程把对象设置为垃圾(标记对象不会访问到对象,说明对象不可达),无须标记。但是按照目前并发标记算法的处理,会对对象进行标记,这种情况造成了错标,产生了浮动垃圾,不过浮动垃圾会在下一次垃圾回收中完成回收。
对于情况2:标记线程是从根集合出发,所有访问到的对象都可以被标记为活跃的。
对于情况3:两类线程都访问了对象,标记线程先访问对象,直接把对象标记为活跃的;应用程序线程后访问对象,即使应用程序线程把访问的对象设置为垃圾(如NULL),也不会存在问题,因为对象已经标记,这种情况造成了错标,产生了浮动垃圾,浮动垃圾会在下一次垃圾回收中完成回收。
对于情况4:应用程序线程先访问对象,标记线程后访问对象。假设标记线程访问对象开始标记时,应用程序线程更改了引用关系,标记线程访问到的则是新的对象。而引用变更前老的对象按照并发标记算法(ZGC使用SATB算法)中防止漏标的介绍,需要把访问的对象进行标记,但是应用程序线程发生在标记线程之前,也就是说应用程序线程根本不知道需要标记老对象,这就导致了漏标的情况。
解决第四种情况中漏标的办法就是使用目前所引入的初始标记。那么为什么引入初始标记的STW就可以解决这一问题?在初始标记中,标记线程会等待应用程序线程暂停,那么就不会发生第四种情况。为了使应用程序暂停的时间足够短,在初始标记中仅仅把根集合直接引用的对象找出来作为并发标记的输入。

得出结论:

并发垃圾回收器一般都需要分为初始标记、并发标记阶段,初始标记需要 STW,否则会产生错标和漏标的问题。
错标不会影响程序的正确性,只是造成所谓的浮动垃圾,在下一次垃圾回收时回收;但漏标会导致可达对象被当作垃圾回收,从而影响程序的正确性。

【ZGC】为什么初始标记需要STW(stop the world) ?相关推荐

  1. 【重难点】【JVM 03】CMS、G1、ZGC

    [重难点][JVM 03]CMS.G1.ZGC 文章目录 [重难点][JVM 03]CMS.G1.ZGC 一.CMS 1.介绍 2.优点 3.缺点 二.G1 1.介绍 2.优势 3.应用场景 4.Re ...

  2. 2-1-9、ZGC详解

    目录 ZGC出现背景 STW带来的问题 手机系统(Android) 显示卡顿 证券交易系统实时性要求 大数据平台(Hadoop集群性能) 垃圾回收器的发展 ZGC简介 ZGC中的内存布局 分配及回收策 ...

  3. JVM系列(十一) 垃圾收集器之 Concurrent Mark Sweep 并发标记清除

    垃圾收集器之 Concurrent Mark Sweep 并发标记清除 上几篇文章我们讲解了单线程垃圾收集器 Serial/SerialOld ,多线程垃圾收集器 Parallel Scavenge/ ...

  4. 十个问题弄清JVMGC(二)

    简介: 每个java开发同学不管是日常工作中还是面试里,都会遇到JDK.JVM和GC的问题.本文会从以下10个问题为切入点,带着大家一起全面了解一下JVM的方方面面. 每个java开发同学不管是日常工 ...

  5. 面试必会系列 - 1.6 Java 垃圾回收机制

    本文已收录至 Github(MD-Notes),若博客中有图片打不开,可以来我的 Github 仓库:https://github.com/HanquanHq/MD-Notes,涵盖了互联网大厂面试必 ...

  6. 一文读懂Java七大垃圾回收器

    java和c++最大的不同就是java中不需要手动去回收对象,在运行时jvm会自动帮我们进行垃圾回收,接下来让我们揭开垃圾收集器的面纱 名词解释 并行:多条线程并行工作 并发:多个线程并发执行,但他们 ...

  7. 【JVM】第三章 垃圾收集机制

    第三章 垃圾收集机制 文章目录 第三章 垃圾收集机制 一.垃圾标记算法 1.引用计数算法 2.根可达性分析算法 二.垃圾收集算法 1.标记 - 清除算法 2.复制算法 3.标记 - 压缩算法 4.对比 ...

  8. 【JVM】最全笔记(黑马+尚硅谷+张龙整合笔记)

    本身整合了如下视频的笔记,并进行了整理:尚硅谷周阳.张龙.黑马程序员 黑马ppt非常好:https://download.csdn.net/download/hancoder/12834607 本文及 ...

  9. JVM (二) 垃圾回收机制概念+垃圾回收器种类

    前言 做一个有趣的程序员.哈哈哈哈 本次铁村的小蓝猫主要给大家详细分享JVM中垃圾回收机制 学习JVM 肯定是要了解垃圾回收机制的. 分享前,我们先了解下本次分享内容的框架. 一.垃圾回收机制定义 1 ...

最新文章

  1. Docker 容器的网络连接
  2. 中文预训练模型ZEN开源,效果领域内最佳,创新工场港科大出品
  3. L4,C16:差1墩,从张数最多的套上去找
  4. 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))
  5. BZOJ 4916 神犇和蒟蒻
  6. 二进制补码以及为什么要使用补码
  7. ViewController的view的创建
  8. Win10改Win7图片查看器|Win10新增加Windows照片查看器
  9. 华为5.0系统如何不用ROOT激活XPOSED框架的步骤
  10. win服务器系统无法切换输入法,Win10系统下中英文输入法无法切换的解决方案
  11. XCTF 攻防世界Web题目 mfw
  12. GDI+绘图基础,绘制表格
  13. 新手操作低客单价时常见的误区有哪些?
  14. e-r数据建模-概念模型 逻辑模型 物理模型-总结
  15. ant-design-vue 1.7.8版本使用报错
  16. api arx autocad_AutoCAD开发选择----ObjectARX还是.net API(转载)
  17. android获取用户手机信息,Android – 使用AccountManager /手机所有者的姓氏和姓氏获取用户数据...
  18. 连接池原理介绍+常用连接池介绍
  19. 写代码的时候,竟然发现了10+个【了不得】的网站,必须分享
  20. html判断是苹果,JavaScript判断是否是iPhone X系列机型,H5和其他环境兼容

热门文章

  1. JS 实现 图片幻灯片 效果。 兼容 FF IE
  2. 天天生鲜项目——我的购物车页
  3. JavaWeb学习第二十七天——项目实例
  4. 2023 云海Chatgtp个人商业源码
  5. Webgis 打印实现技术细节
  6. eds能谱图分析实例_成分分析的四大神器—XRF、ICP、EDX和WDX
  7. vue3(vite)设置代理,封装axios,api解耦
  8. java以空格为界限计算字数,如何在docx / odt(rtf)文件中用空格计算字符数?
  9. 攻防世界_难度8_happy_puzzle
  10. TL431应用电路与LTspice仿真