当前位置: 首页 > article >正文

【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 被孤立(无灰色对象引用它),最终被误回收。导致系统异常

http://www.lryc.cn/news/2403853.html

相关文章:

  • 【uniapp开发】picker组件的使用
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(三十一) -> 同步云端代码至DevEco Studio工程
  • 如何评估大语言模型效果
  • go-zero微服务入门案例
  • Python控制台输出彩色字体指南
  • 零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
  • 开源之夏·西安电子科技大学站精彩回顾:OpenTiny开源技术下沉校园,点燃高校开发者技术热情
  • html、css(javaweb第一天)
  • 解决数据库重启问题
  • 前后端交互过程中—各类文件/图片的上传、下载、显示转换
  • SparkSQL 优化实操
  • 【vLLM 学习】Cpu Offload Lmcache
  • 数据库同步是什么意思?数据库架构有哪些?
  • 【数据结构】详解算法复杂度:时间复杂度和空间复杂度
  • Rest-Assured API 测试:基于 Java 和 TestNG 的接口自动化测试
  • 多模型协同:基于 SAM 分割 + YOLO 检测 + ResNet 分类的工业开关状态实时监控方案
  • 【分销系统商城】
  • LangChainGo入门指南:Go语言实现与OpenAI/Qwen模型集成实战
  • 5.1 HarmonyOS NEXT系统级性能调优:内核调度、I/O优化与多线程管理实战
  • react public/index.html文件使用env里面的变量
  • chili3d 笔记17 c++ 编译hlr 带隐藏线工程图
  • 创建一个纯直线组成的字体库
  • 接口不是json的内容能用Jsonpath获取吗,如果不能,我们选用什么方法处理呢?
  • 使用 Docker Compose 从零部署 TeamCity + PostgreSQL(详细新手教程)
  • Go 语言实现高性能 EventBus 事件总线系统(含网络通信、微服务、并发异步实战)
  • Linux进程(中)
  • 【计算机组成原理】计算机硬件的基本组成、详细结构、工作原理
  • npm error Cannot read properties of null (reading ‘matches‘)
  • MVC分层架构模式深入剖析
  • 【方案分享】蓝牙Beacon定位精度优化(包含KF、EKF与UKF卡尔曼滤波算法详解)