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

Jvm中的三色标记到底是个啥

你可以对比理解,

垃圾收集算法是去处理垃圾的,但是如何知道哪些是垃圾就需要去标记,如果你可以接受项目停顿,其实你也可以不用三色标记,但是很显然,说到底客户无法接受卡顿的程序

在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引用可能发生变化,多标和漏标的情况就有可能发生。漏标的问题主要引入了三色标记算法来解决。
三色标记算法是把Gc roots可达性分析遍历对象过程中遇到的对象, 按照“是否访问过”这个条件标记成以下三种颜色:

  黑色

表示对象已经被垃圾收集器访问过, 且这个对象的所有引用都已经扫描过。 黑色的对象代表已经扫描过, 它是安全存活的, 如果有其他对象引用指向了黑色对象, 无须重新扫描一遍。 黑色对象不可能直接(不经过灰色对象) 指向某个白色对象

  灰色

表示对象已经被垃圾收集器访问过, 但这个对象上至少存在一个引用还没有被扫描过。

  白色

表示对象尚未被垃圾收集器访问过。 显然在可达性分析刚刚开始的阶段, 所有的对象都是白色的, 若在分析结束的阶段, 仍然是白色的对象, 即代表不可达。

  简要概括如下

image

 

这里的黑色很明确,就是存活对象,不能去动的

灰色是要清理掉的,白色作为垃圾要全部回收的

以上就是对象被标记后的去处

但是你要知道,对象被标记的时候,我们的程序可并没有停止哦

也就是虽然被标记了,但是你的业务代码也在修改对象引用,是不是尴尬了

就是在标记的时候是活的,但是标记之后,又被抛弃这个引用了,变成了垃圾,需要被回收,但是本次做完标记,只能把标记的处理掉,但是它不在本次的处理队列中,因而他就成了浮动的垃圾

就是还有一个问题,本来是个死的,结果被程序搞了个引用,程序活了,你再去删的时候,就有问题了,所以这种情况可能需要来个网子拦一下

好了,下面我们将对两种情况针对性分析

针对浮动垃圾,jvm允许它的存在

而对于加网子的事,提供了两种方案

第一种是增量更新

黑对象新增引用,要重新关注

image

 第二种就是Snapshot At The Beginning

image

 下面来一段总结

在并发标记过程中,由于用户线程会修改对象引用关系,可能导致三色标记出现漏标问题。JVM通过写屏障记录引用变化(如CMS的增量更新、G1的SATB),保证对象不会被错误回收;而在ZGC等收集器中,通过读屏障保证对象在移动过程中的访问正确性

  那还会存在漏掉未处理或者误操作的吗,答案是会有漏的,但是漏掉的下次处理就好了,但是误删问题就没有了

在并发标记过程中,确实可能由于引用关系变化导致标记不精确,但 JVM 通过写屏障和最终的 remark 阶段保证不会发生漏标,从而避免误删活对象。而对于多标产生的浮动垃圾,JVM选择延迟回收,在下一次GC中处理,这是在停顿时间和回收精度之间的权衡。

  好了关于三色标记的介绍就到这里了

http://www.jsqmd.com/news/668104/

相关文章:

  • 2025届学术党必备的六大降AI率神器推荐
  • 保姆级教程:用TSM模型从零搭建视频打架检测系统(附完整代码)
  • 如何高效逆向分析Delphi程序:IDR工具深度解析与应用指南
  • 为什么92%的AI团队尚未布局量子-AGI交叉栈?2026奇点大会闭门报告首次披露技术迁移路线图
  • 终极指南:HandheldCompanion虚拟控制器连接与性能优化全攻略
  • 为什么北约AI作战指令必须含“人类否决权”硬编码?——揭秘IEEE 7000-2023标准第12.4条背后的3起真实误击事件
  • 20232223 实验二 《Python程序设计》实验报告
  • 全球仅17个认证节点在运行的AGI灾害推演平台,中国占8席——SITS2026专家亲授接入标准与合规避坑指南
  • 从不敢开口到搞定印度客户:我的SAP Global项目英语实战踩坑与提升记录
  • 从一次线上性能排查说起:我是如何用CPU亲和性(sched_setaffinity)给Nginx工作进程做绑核优化的
  • 2026年降AI工具按次付费和包月套餐哪种更划算:长期用户费用对比
  • Halcon镜头畸变矫正后,你的标定板图像真的“干净”了吗?一个容易被忽略的细节
  • 从课设到实战:用LM386和运放搭建一个带蓝牙的桌面小音响(附PCB与避坑心得)
  • ESP8266开发环境二选一:手把手教你用AiThinkerIDE_V1.5.2玩转NonOS与RTOS SDK(含项目迁移避坑指南)
  • 别再手动解析串口数据了!给单片机项目嵌入一个极简RPC框架的完整指南
  • 3分钟快速上手:Windows终极免费虚拟光驱工具完整指南
  • Google 地图控件集
  • CANoe实战:手把手教你配置UDS诊断0x10服务的CDD文件(含P2/P2*参数详解)
  • 三步重塑Windows体验:Winhance中文版实战手册
  • 手把手教你用SM2246EN主控板DIY 512G MLC固态U盘(含避坑指南)
  • 告别密码!在Arch Linux上用Howdy实现人脸解锁登录和sudo认证(保姆级避坑指南)
  • 2026年高校AIGC检测升级了什么:新版检测和旧版的核心差异解读
  • 2026年AI工具怎么选?别只看参数,先想清楚这3个问题
  • ARM64 Mac 自动化游戏实战:MAA与ALAS双端部署与优化指南
  • 从手机射频到CPU供电:拆解身边电子产品,看耦合与去耦电容如何各司其职
  • 3步解锁旧Mac潜能:OpenCore Legacy Patcher完整使用指南
  • NumPy广播机制深度解析:从ValueError: operands could not be broadcast together with shapes说起
  • 为什么导师用肉眼也能看出AI写的文章:AI写作特征深度分析
  • STM32F103C8T6新手避坑指南:用软件IIC读取MPU6050原始数据,串口打印实测(附完整工程)
  • Proxmox Mail Gateway (PMG) 部署与基础安全配置实战