cms收集器为什么会产生浮动垃圾?

cms垃圾收集器采用三次标记,一次清除来对垃圾进行标记,清除的,第一次标记是stop-the-world的,用来标记处gcroot可达的对象。第二次标记是并发标记,用来根据root对象进行标记出可关联的对象。
没有stop-world,第三次标记,重新标记,用来标记并发标记产生的变动对象。

问题: 为什么只有第二次标记不需要stop-world?
要知道堆区的对象很多,老年代最多,如果对老年代所有的对象标记时进行stop-world,那么停顿时间就太长了,用户难以忍受,而我们只需要标记处root节点就可以了,所以第一次标记时,stop-world就是为了标记出root节点,第二次标记不需要stop-world,只需要对这些root节点往下继续扫描。因此第二次标记不需要stop-world就是为了减少stop-world的时间。
问题:为什么第二次标记会产生浮动垃圾?
因为第二次标记是和用户线程并行的,因此用户线程可能会随时对一个标记为可达的对象进行修改成不可达,例如a引用了b,此时b被扫描为可达,但是用户线程之后对a.b=null,这个时候b依然作为可达的,因此就成了浮动垃圾。

问题:除了浮动垃圾外,第二次标记还有什么问题:?
对象消失的问题,因为用户线程和gc线程并行,不仅仅用户会把之前标记为可达的对象改为没有引用外,还会对一个理论上不可达的对象变的可达,例如a.b=c c.d=e, 如果gc只扫描到了b,然后用户线程突然把b.c=null,c.d = a.d ;这个时候 c已经不可达了,虽然d被a.d引用,但是由于gc认为a已经被扫描过了,因此d就是一个不可达的对象,会被清理掉。

标记的底层原理:
三原色标记,黑色表示该节点所有的引用都被扫描了,灰色表示部分扫描过了,白色表示没有被引用。
所以第二次扫描的时候,原来是非白色的,被用户去掉了引用,这个时候,该多余的黑色就成了浮动垃圾,本次无法被清理,只能等下次清理。
一些黑色的节点,被用户线程意外的加入了一个白色节点,这个时候,该白色不会被扫描,就会被清除,导致对象消失。

问题:如果防治对象消失的?
jvm在执行引用赋值的时候实际上也运用了类似aop的技术原理,即在赋值前后进行around通知,来进行修改,对于cms收集器,可以对黑色节点加入白色之后进行修改源节点色颜色,使黑色变成灰色。原理是通过一个写屏障,在对引用赋值时,加入屏障进行aop执行。
对于g1收集器,则是完全对灰色节点进行重新扫描。

cms三次标记浮动垃圾是如何产生的相关推荐

  1. 三分钟了解JVM的垃圾回收和三色标记

    今天,我争取用三分钟,说清楚JVM中的垃圾回收和三色标记,倒计时,开始. 什么是垃圾 垃圾的定义 垃圾,在我们日常生活中,就是使用过后不再需要的东西.并且随着时间的推移,你产生的垃圾会越来越多.怎么清 ...

  2. JVM - 你们垃圾回收器用的什么? G1有哪些特点?G1如何实现可预测的停顿时间?漏标问题如何解决的?介绍下三色标记?说说STAB 算法 ?

    文章目录 1.GC需要完成的3件事情是什么? 2. 那为什么我们还要去了解GC和内存分配呢? 3.什么是内存溢出?什么是内存泄露? 4.程序计数器,虚拟机栈,本地方法栈为什么不需要考虑垃圾回收? 5. ...

  3. 垃圾收集器以及三色标记

    分代收集理论 当前虚拟机的垃圾收集采用分代收集算法,只是根据对象存活周期的不同将内存分为几块. 一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法 新生代:每次 ...

  4. 【11-JVM面试专题-说说你知道的垃圾回收算法?垃圾回收器你知道吗?CMS、G1和ZGC垃圾回收器你有过了解吗?】

    JVM面试专题-说说你知道的垃圾回收算法?垃圾回收器你知道吗?CMS.G1和ZGC垃圾回收器你有过了解吗? JVM面试专题-说说你知道的垃圾回收算法?垃圾回收器你知道吗?CMS.G1和ZGC垃圾回收器 ...

  5. 为什么CMS两次标记时要 stop the world(阿里面试)

    1.CMS及其执行过程? CMS,全称Concurrent Mark and Sweep,用于对年老代进行回收,目标是尽量减少应用的暂停时间,减少full gc发生的机率,利用和应用程序线程并发的垃圾 ...

  6. 02.2跟雨痕看go源码- 并发清理与三色标记

    据说这是go优化最狠的地方. http://blog.csdn.net/erlib/article/details/51850912 大意是说twitch.tv觉得一次标记的STW(stop the ...

  7. 【JVM】四种GC算法(分代收集+三种标记算法)

    目录 参考文章 四种GC算法 分代收集算法(理论) 标记清除算法 标记整理算法 标记复制算法 三种算法的优缺点 参考文章 JVM的4种垃圾回收算法.垃圾回收机制与总结_我是guyue,guyue就是我 ...

  8. 您如何确定以编程方式发送的电子邮件不会自动标记为垃圾邮件?

    这是一个棘手的问题,我一直依靠诸如基于权限的电子邮件(即仅发送给您有权发送给其的人)之类的技术,而不使用公然的垃圾邮件术语. 最近,我以编程方式发送的某些电子邮件已经开始自动洗牌到用户的垃圾邮件文件夹 ...

  9. 关于自己搭建的邮件被微软反垃圾邮件标记为垃圾邮件

    昨天发的邮件被拒绝了,提示这么一堆英文:翻译过来的意思是:被微软的反垃圾邮件标记为垃圾邮件了,解决方法就是:登陆微软的反垃圾:https://sender.office.com/ 输入禁止的邮件和IP ...

  10. 《精彩绝伦的CSS》——布局(三)遏制浮动

    三.遏制浮动 若一个容器中的元素全部采用浮动,则该容器如果没有自适应包裹内容其高度就会为0. 如下: div#container{ border: 2px dashed gray; backgroun ...

最新文章

  1. Recyclerview 添加一个数组
  2. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解 | 必须收藏!
  3. 微信小程序开发工具 清除授权缓存/文件缓存/登录缓存等等
  4. 大剑无锋之HashMap全考点
  5. leetcode 398. Random Pick Index | 398. 随机数索引(Java)
  6. php 数组转json乱码,php将数组转为json涌现中文乱码怎么办_后端开发
  7. cUrl 强大的文件上传/下载工具
  8. jbod ugood 磁盘驱动状态_NTFS磁盘读写工具Mounty免费版
  9. sas9.3软件java_SAS9.3 64位版Win7安装指引
  10. Exchange 2010输入序列号方式
  11. 天线效应产生原因及解决办法
  12. WPS表格如何在数字前面批量增加人民币符号和在后面添加元?
  13. GNU/Linux与Windows魔兽争霸3局域网对战安装与配置
  14. Visio 32位下载
  15. Spring MVC过滤器-HttpPutFormContentFilter
  16. 2022美国大学生数学建模竞赛报名通知
  17. dubbo+zookeper实现分布式服务部署实例
  18. Android学习 - Material Design设计规范
  19. 可视化学习:社团划分算法——标签传播算法LPA及优化
  20. php 转为文本,php html转换成text文本函数

热门文章

  1. 在墨刀中使用思维导图
  2. linux中如何开启vnc服务端口,Linux下vnc配置及启动
  3. Java实现扫码枪二维码自动跳转网页(基于键盘监听)
  4. LDD3 sleepy 模块
  5. 【老罗笔记】异类(Outliers)
  6. minio error occured
  7. A Survey on Vision Transformer
  8. 二维数组调时候的传参问题 and 一维数组的中括号秘密( [ ] )——实参与形参的对应 —————— 开开开山怪
  9. 使用ShareX+sm.ms实现截图后自动上传图片至图床
  10. 9款最好用的Bilibili影片下载线上工具推荐