首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >你知道JVM 是如何解决并发标记过程中:多标和漏标的情况么?

你知道JVM 是如何解决并发标记过程中:多标和漏标的情况么?

作者头像
AI码师
发布2022-12-22 10:26:56
发布2022-12-22 10:26:56
8660
举报

B站搜索“乐哥聊编程“有本篇文章配套视频‍ https://www.bilibili.com/video/BV1f3411f7LC

并发标记带来的问题

在cms收集器和g1收集器,都使用了并发标记,用户线程和gc线程同时工作,所以在并发收集过程中,或多或少会发生一些对象引用的变化,最终会导致多标或漏标的现象。

三色标记

黑色

如果一个对象被标记成黑色,那就说明它已经被垃圾回收器扫描过,并且这个对象的所有引用已经全部扫描过,黑色代表它是存活的,不会被回收

灰色

代表对象被扫描过,但是这个对象上至少还有一个引用没被扫描过

白色

代表对象从未被垃圾收集器扫描过,如果它一直是白色的,迎来它的只有一个结果:被垃圾回收器回收,但是在初始阶段时,所有对象都是标记成白色的

多标一定要解决么?

首先我们来看看,多标会产生什么问题,假如一个对象被扫描后,被标记成黑色(存活对象),但是在并发标记过程中,这个对象引用发生了变化(变成需要回收的对象),但是我们已经将这个对象标记成不回收对象,最终导致这个对象在这次gc过程中,没有被回收(应当被回收的),所以就变成了浮动垃圾。

其实针对这种现象,我们可以不用解决的,可以先保留这个对象,等下次gc ,回收这个对象。

漏标一定要解决!!!

相对于多标,漏标的问题就严重多了,因为它有可能导致程序出现意想不到的结果:回收了不该回收的对象,相当于你得罪了一个不该得罪的人,你知道后果严重性的哈。

那么这个问题怎么解决呢,这里有两种方式:

增量更新

当白色对象被重新指定引用时,如果被指定的对象被标记成黑色,就将这个引用关系记录下来,等并发标记结束后,将记录下来的这些引用关系重新扫描一遍,以黑色对象为根,相当黑色对象又变成了灰色对象。

原始快照

当如果一个白色对象要和灰色对象断开关系时,就将这对关系也记录下来,在并发标记结束之后,就从记录里面找出这些对象,以灰色对象为根,重新扫描,目的就是为了再次扫描白色对象,让白色对象存活下来,成为黑色对象。虽然有可能成为浮动垃圾,但是没关系,可以等待下次gc被回收

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乐哥聊编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 并发标记带来的问题
  • 三色标记
    • 黑色
    • 灰色
    • 白色
  • 多标一定要解决么?
  • 漏标一定要解决!!!
    • 增量更新
    • 原始快照
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档