【JVM】三色标记法原理

在JVM中,三色标记法是GC过程中对象状态的判断依据,回收前给对象设置上不同的三种颜色,三色分为白色、灰色、黑色。根据颜色的不同,决定对象是否要被回收。

++白色表示++:

  • 初始状态:所有对象未被 GC 访问。
  • 含义:待扫描对象(可能是垃圾)。
  • GC 结束时:所有白色对象视为垃圾,被回收。

++灰色表示++:

  • 含义:已被 GC 访问,但其引用的对象还未扫描完。
  • 作用:表示"中间状态",是标记过程的待处理队列。

++黑色表示++:

  • 含义:对象及其直接引用对象均被扫描完成。
  • 关键:黑色对象不会被重新扫描,视为存活对象。

执行过程

最初始时,所有对象的颜色为白色。进行GC时,从引用链的根(GC Root)开始扫描,GC Root自身标记为黑色,与其直接相连的对象标记为灰色,然后从灰色开始寻找可达的对象并将其标记为灰色,到最后仍为白色的对象表示不可达对象,进行回收。

也就是当对象其直接引用对象还未被扫描完时,这个对象的颜色为灰色。

如图所示,

1.从GC Root开始扫描,扫描到对象A和对象B,标记为灰色。

2.对象B有一个引用对象,被扫描到后,对象B由灰色变为黑色,对象E标记为灰色

3.对象E没有引用对象,直接标记为黑色

4.对象A有两个引用对象,对象C已经被扫描到,对象D还未被扫描到,则对象C标记为灰色,对象 D仍为白色,由于对象A的引用对象为全被扫描到,所以其颜色暂时仍要保持灰色

5.对象F没有直接或间接与GC Root相连,所以其颜色为白色不变

6.扫描完成后,开始回收对象,白色对象被认为没有被任何对象引用,可以进行回收。在图中,最终只有对象F为白色,所以将对象F进行回收。

存在的问题:

漏标问题

在GC过程中,黑色对象(A)新增引用指向白色对象(C)。灰色对象(B)断开引用指向白色对象(C)。

这个时候则发生了:对象C刚变为白色,对象A就引用了对象C,还没来得及变色。这个时候对象C被清理了。

此时 C 被孤立(无灰色对象引用它),最终被误回收。导致系统异常

相关推荐
找方案16 小时前
AI+气象预报:华为盘古大模型如何让天气预报精准到街区
人工智能·算法·机器学习
敲代码的嘎仔16 小时前
互动问答系统实战:两级评论模型、ES 搜索集成、Caffeine 多级缓存全记录
java·开发语言·数据库·elasticsearch·缓存·mybatis·高并发
yujunl16 小时前
找不到指定的SDK(“Microsoft.NET.Sdk.Web“)
开发语言
Yingye Zhu(HPXXZYY)16 小时前
洛谷B4337 [中山市赛 2023] 简单数学题
c++·算法
郝学胜-神的一滴16 小时前
C++11 工程级应用 12:编译期类型魔法,干掉重复与臃肿的代码
开发语言·数据结构·c++·软件工程·visual studio
CoderYanger16 小时前
Java EE 进阶:2.3 JavaScript 综合案例
java·前端·javascript·css·职场和发展·java-ee·html
starzy199016 小时前
Flink TimeWindow 详解及代码实现:从三种时间语义到滚动与滑动窗口
java·服务器·flink
pen-ai16 小时前
【优化方法】为什么梯度是最陡峭的方向?
人工智能·算法·机器学习·最小二乘法
重生之小比特16 小时前
【Java SE】类和对象(一)
java·ide·intellij-idea
个 人 练 习 生16 小时前
数据结构:排序算法详解
c语言·数据结构·经验分享·学习·算法·排序算法