jvm三色标记

好的,咱们把专业概念和生活例子结合起来,一步一步说清楚三色标记法:

一、核心概念:用“颜色”给对象贴“状态标签”

就像给家里的物品贴标签,每种颜色代表它在“垃圾回收(大扫除)”中的状态:

  1. 白色(White)
    • 专业定义:初始状态,所有对象默认是白色,代表“未被回收器访问,且暂时不确定是否有用”。回收结束后仍为白色的,就是垃圾,会被清理。
    • 生活例子:你刚进房间,地上的旧杂志、空饮料瓶都先贴“白色”——你还没检查它们,不知道该不该留。
  1. 灰色(Gray)
    • 专业定义:已被回收器访问,但它引用的其他对象还没处理完(相当于“待办清单”)。
    • 生活例子:你手里的书包肯定有用(不能扔),但书包里的东西还没掏出来看,所以给书包贴“灰色”——提醒自己:这东西得接着查里面的东西。
  1. 黑色(Black)
    • 专业定义:已被回收器访问,且它所有引用的对象都处理完了,代表“确定有用,无需再管”。
    • 生活例子:你把书包里的课本、笔盒都检查完了,这时给书包贴“黑色”——表示“书包有用,而且里面的东西也都查过了,不用再碰它了”。

二、工作流程:就像“从确定有用的东西开始,一步步排查所有该留的物品”

1. 初始阶段:先找到“绝对有用的东西”(根对象)
  • 专业定义:根对象是程序中明确活跃的引用(如栈里的变量、静态变量),它们一定有用,是标记的起点。初始时所有对象都是白色,只有根对象被标为灰色。
  • 生活例子:你进房间后,先找出“肯定不能扔”的东西——比如你正拿着的手机、身上穿的外套(这些是“根对象”),给它们贴“灰色”(因为要查它们关联的东西,比如手机壳、外套口袋里的钥匙)。
2. 标记阶段:从灰色开始,一步步“查关联、更新标签”
  • 专业定义:从灰色对象出发,遍历它引用的所有对象:
    • 把一个灰色对象标为黑色(确认它本身有用);
    • 扫描它引用的对象:如果是白色,就标为灰色(加入待查队列);如果已经是灰/黑色,就跳过(避免重复查)。
    • 重复到灰色对象为空(所有有用的都被标记)。
  • 生活例子
    • 拿灰色的手机,贴成黑色(确认手机有用),然后看它的手机壳(白色→贴灰色);
    • 拿灰色的手机壳,贴成黑色,发现它挂着一个挂饰(白色→贴灰色);
    • 拿灰色的挂饰,贴成黑色,发现它没别的关联了;
    • 直到手里没有灰色标签的东西了(所有和“根对象”有关的有用物品都查完了)。
3. 回收阶段:清掉剩下的“白色垃圾”
  • 专业定义:标记结束后,白色对象都是“无法通过根对象访问的垃圾”,通过“清除”或“整理”释放内存。
  • 生活例子:最后剩下的白色标签物品(旧杂志、空饮料瓶),都是“和有用的东西没关系”的垃圾,直接扔进垃圾桶。

咱们结合“打扫房间”的生活场景,同时对应专业逻辑,来讲清楚漏标问题的原因和解决方案:

一、漏标问题:为什么会误删有用的东西?

专业本质:并发回收时,用户线程修改对象引用,导致本应被保留的活跃对象未被标记,最终被误判为垃圾。


生活例子:清洁工(回收器)和你(用户线程)同时在房间里活动,你突然挪动了一个有用的东西,清洁工没察觉,最后把它当垃圾扔了。

漏标的两个必要条件(缺一个都不会发生):
  1. “已处理完的对象”失去了对某个对象的引用
    • 专业:黑色对象(已扫描完的活跃对象)原本引用着一个白色对象(未扫描),但用户线程突然断开了这个引用。
    • 生活:清洁工已经查完你的书包(贴黑色标签,代表“处理完”),知道里面有个钱包。但你偷偷把钱包从书包里拿了出来,书包里没钱包了。
  1. 这个对象被转移到了“未处理的角落”
    • 专业:被挪走的白色对象,被另一个白色对象(未被扫描,不在待处理队列)引用了。
    • 生活:你把钱包塞进了一个没贴标签的抽屉(白色标签,代表“未处理”),而清洁工不知道这个抽屉里多了个钱包。

结果:清洁工觉得“钱包既不在已处理的书包里,也不在待处理的清单上”,最后把钱包当垃圾扔了——这就是漏标。

二、解决方案:如何避免漏标?

核心逻辑是阻止上述两个条件同时成立,确保所有有用的东西都能被清洁工(回收器)发现。

1. 增量更新:“已处理的东西被动过?重新查!”
  • 专业原理:如果黑色对象(已处理)的引用被修改,就强制将其变回灰色,重新扫描它的所有引用,避免遗漏。
  • 生活例子:规则规定:“只要动过已查完的东西(黑色标签),就必须重新查一遍。”你从书包(黑色)里拿出钱包后,书包自动变回灰色标签。清洁工重新检查书包时,发现你把钱包移到了抽屉,就会顺着去查抽屉,找到钱包。
2. 原始快照:“按刚开始的样子算,不管后来怎么动”
  • 专业原理:标记开始时记录所有对象的引用关系快照,回收器只认快照中的引用,忽略后续修改。
  • 生活例子:清洁工打扫前先给房间拍了张全景照(快照),照片里钱包还在书包里。不管你后来把钱包移到哪,清洁工都按照片里的线索查——既然照片里书包有钱包,就会一直追查,直到找到钱包,不会当垃圾扔。

简单说,漏标就是“回收器没跟上用户线程的修改”导致的误判,解决方案要么是“修改时主动提醒”,要么是“让已处理的对象重新检查”,要么是“按初始状态为准”,最终目的都是确保有用的东西不会被漏掉~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919478.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成式AI的能力边界与职业重构:从“百科实习生“到人机协作增强器

根据微软最新研究,基于20万条Copilot使用数据及用户反馈,研究者揭示了生成式AI在实际应用中的能力边界与职业影响。数据显示,用户使用AI助手最频繁的任务是信息获取(占比近40%),其次是公众沟通类工作&#…

java17学习笔记

Java17是一个重要的特性发布,也是比较常用的一个版本,根据 2024Java生态统计,Java 17、11 和 8 的用户比例分别为 35%、33% 和 29%。它遵循了自Java10以来引入的Java发布步调,并于2021年 9 月 14 日发布,在Java16发布后…

【AI应用】修改向量数据库Milvus默认密码

说明: 1)部署向量数据库milvus运行一段时间后,想开启密码认证登录attu页面 2)开启密码认证登录,提示用户和密码不正确,因为默认密码已存储在物理机 3)通过attu管理页面修改向量数据库milvus默认…

分布式系统消息队列:可靠投递与延时消息实战

在分布式系统架构中,消息队列(MQ)作为解耦服务、削峰填谷、异步通信的核心组件,其消息投递的可靠性与延时消息的精准性直接影响业务系统的稳定性。本文结合实际业务场景,详细解析消息投递的全流程设计与延时消息的通用…

Java 学习笔记(基础篇6)

面向对象基础1. 类和对象(1) 示例:public class Student {String name "张三";int age 23;public void study() {System.out.println("学习 Java");}public void eat() {System.out.println("吃饭");} }public class Test {public …

光学件加工厂倚光科技:陪跑光学未来力量

在光学创新的漫漫长路上,总有一些看似 “不划算” 的坚持,却在悄然改写行业的未来。倚光科技的故事,就始于这样一种选择 —— 明知光学打样利润微薄,明知上百个项目中能走到量产的寥寥无几,仍愿意投入全球顶尖的设备与…

RabbitMQ:生产者可靠性(生产者重连、生产者确认)

目录一、生产者重连二、生产者确认一、生产者重连 当网络不稳定的时候,利用重试机制可以有效提高消息发送的成功率。不过SpringAMQP提供的重试机制是阻塞式的重试,也就是说多次重试过程中,当前线程是被阻塞的,会影响业务性能。 …

【深度学习新浪潮】空天地数据融合技术在城市三维重建中的应用

空天地数据融合技术在城市三维重建中的应用已取得显著进展,尤其在提升精度以满足具身智能机器人仿真训练需求方面,研究和产品均呈现多样化发展。以下是关键研究进展、产品方案及精度要求的详细分析: 一、研究进展与技术路径 1. 多源数据融合的技术突破 时空基准统一:通过…

Selenium自动化测试入门:cookie处理

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快driver.get_cookies() # 获得cookie 信息driver.get_cookies(name) # 获得对应name的cookie信息add_cookie(cookie_dict) # 向cookie 添加会话信息delete_cookie(na…

快解析如何让远程访问更安全?

一、勒索病毒攻击服务器的途径很多用户服务器对外开放,实现外网访问,担心服务器被勒索病毒攻击!勒索病毒攻击服务器的途径之一是通过路由器开放的端口进行扫描攻击,所以尽量不要在服务器的路由器和防火墙中开放端口二、快解析如何…

Linux下编译ARPACK

本文记录Linux下编译ARPACK的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、依赖 1.1 安装oneAPI 参见:Get the Intel oneAPI Base Toolkit , Get the Intel oneAPI HPC Toolkit 二、编译ARPACK …

芋道RBAC实现介绍

说明:之前写过一篇博客,介绍如何搭建一个基于角色的权限验证框架 搭建一个基于角色的权限验证框架 本文介绍在非常受欢迎的开源框架——芋道中是如何实现 RBAC 的,芋道的部署参考下面这篇文章: 芋道微服务代码部署 介绍 一般…

Docker部署Jellyfin,没有公网IP如何使用内网穿透远程访问?

Jellyfin是一款完全开源、免费的媒体服务器,可帮助你快速搭建属于自己的私人流媒体平台:电影、剧集、音乐、照片统统收纳,跨设备随点随播。本文将以最简洁的步骤,演示如何在Docker容器中部署Jellyfin,并通过贝锐花生壳…

Podman:Mysql(使用卷)

下载镜像hpphcomp:~$ podman pull docker.1ms.run/mysql:latest Trying to pull docker.1ms.run/mysql:latest... Getting image source signatures Copying blob c81e70a25040 done | Copying blob 31f7d8dc4024 done | Copying blob b9916866e45f done | Copying blob …

2025年渗透测试面试题总结-21(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 一、文件上传绕过方式(Top 5) 二、文件包含高危函数(PHP为例&#xff0…

像海绵一样吸收技术书籍的高效学习方法

像海绵一样吸收技术书籍的高效学习方法前言六步高效阅读法步骤1:快速浏览章节步骤2:先读章末测验步骤3:只读粗体字步骤4:只读每段的首句和末句步骤5:通读整章步骤6:复习与重复高效学习技术书籍的实用技巧1.…

Day60--图论--94. 城市间货物运输 I(卡码网),95. 城市间货物运输 II(卡码网),96. 城市间货物运输 III(卡码网)

Day60–图论–94. 城市间货物运输 I(卡码网),95. 城市间货物运输 II(卡码网),96. 城市间货物运输 III(卡码网) 今天是Bellman_ford专场。带你从普通的Bellman_ford,到队列…

Jenkins服务器SSH公钥配置步骤

步骤1. 在Jenkins服务器上生成SSH密钥在Jenkins服务器上执行以下命令:# 1. 生成SSH密钥对 ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""# 2. 设置正确的权限 chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub# 3. 查看公钥内…

数据链路层-网络层-传输层

文章目录深入浅出理解网络核心:从交换机到TCP/UDP一、数据链路层:交换机的"地盘"1. 数据链路层的核心功能2. 以太网的发展历程3. 以太网中的MAC地址4. 以太网帧格式:数据的"快递包装"5. 交换机的工作原理:高效…

专题:2025跨境电商市场布局、供应链与产业带赋能报告 |附130+份报告PDF、原数据表汇总下载

原文链接:https://tecdat.cn/?p43616 2025年,跨境圈的老板们集体焦虑:美国关税飙到145%,亚马逊封号潮卷土重来,而东南亚却悄悄涨了246%!这不是危言耸听——66%的美国消费者说,海外货涨10%就换本…