深入理解三色标记、CMS、G1垃圾回收器
三色标记算法
简介
三色标记算法是一种常见的垃圾收集的标记算法,属于根可达算法的一个分支,垃圾收集器CMS,G1在标记垃圾过程中就使用该算法
三色标记法(Tri-color Marking)是垃圾回收中用于并发标记存活对象的核心算法,通过颜色状态跟踪对象可达性,解决并发标记期间因应用线程修改引用导致的漏标或多标问题
- 白色(White):未访问对象(可能是垃圾)
- 灰色(Grey):已访问对象,但其子引用(成员变量)未被扫描
- 黑色(Black):已访问对象,且其子引用已完全扫描
核心规则:
- 黑色对象不会直接指向白色对象(否则会漏标)
- 所有存活对象最终会被标记为黑色,白色对象可安全回收
运行过程
①开始前,所有对象都在白集合中

②被根对象GC ROOT直接引用的对象变成灰色,放进灰集合中
③上一步灰色的对象全部变成黑色,进黑色集合中,而灰色的直接引用对象变成灰色进灰集合

④依旧参照上一步

⑤直到灰集合中没有对象,所有的要存活对象都被扫描过了,白色的对象为垃圾会被回收掉

多标和漏标问题

在并发标记阶段,垃圾收集器线程和用户线程同时运行,此时E,F已经被扫描了,E变成黑色,F变成灰色,但是接下来用户线程执行了E.F = null,会导致EF之间连线断开,但是此时F已经变成灰色,但现在实际上F要成为白色的,又不能从灰->白,黑->灰,所以F就是多标了(本应该是垃圾,但是被标记救活了),F就成了浮动垃圾,但是多标问题危害不大,因为下个垃圾回收周期就会把他们清除掉

依旧是在并发标记阶段,垃圾收集器线程和用户线程同时运行,此时E,F已经被扫描了,E变成黑色,F变成灰色,但是接下来用户线程执行F.G = null E.G = G,会导致FG之间连线断开,而EG之间建立连线,因为黑色对象不能指向白色对象(因为黑色对象的意思就是已经被扫描过,不会再扫描),就会导致G一直是白色最后会被回收掉,但实际上G是有用的对象,所以G就是漏标了(本应该是存活对象,但是没被标记被回收了),这个漏标的危害就会很高,因为在实际上这个对象还是要用的,就可能会导致空指针NullpointException
漏标问题是如何解决的
首先漏标必须保证两个必要条件:
①至少有一个黑色对象指向白色对象(黑色对象E ----> 白色对象G 之间有连线)
②所有指向该对象的灰色对象都断开连接(灰色对象 F ----> 白色对象G 之间的连线断开)
所以CMS和G1就是破坏其中一个条件来解决漏标问题。
CMS解决漏标问题---增量更新方案
就是把黑色对象指向白色对象 中的黑色对象变成灰色,然后以灰色对象D为根节点,扫描整个引用链
G1解决漏标问题---原始快照方案
在并发标记阶段,灰色对象对白色对象的连接断开了,会把白色对象给记录下来,在最终标记阶段,会把白色对象变成灰色,然后再以灰色对象为根节点,去扫描整个引用链
CMS(Concurrent Mark-Sweep)
简介
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它通过并发标记-清除算法,减少应用程序的停顿时间,适合对延迟敏感的应用场景。
在CMS之前的垃圾回收器,要么就是串行垃圾回收方式(Serial GC),要么就是关注系统吞吐量(Parallel Scavenge)。
工作流程
①初始标记(STW):标记所有的GC ROOT以及被根对象直接引用的对象

②并发标记:垃圾回收器将遍历对象图,从GC Roots向下追溯,标记所有可达的对象。这个过程是四个阶段中耗时最长的,但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行。
特点:
与应用线程并发执行。
可能产生浮动垃圾(标记期间应用程序新产生的垃圾)
为了解决这个问题,CMS采用了卡表。当应用线程试图修改老年代的某个对象引用时,把这些发生变化的对象所在的Card标识为Dirty,这样后续就只需要扫描这些Dirty Card的对象,从而避免扫描整个老年代。
③重新标记(STW):修正并发标记期间因应用线程运行导致的对象引用变化,实际上是要扫描整个堆内存的,但是实际上,由于各种优化技术,比如增量更新(Incremental Update)和卡表(Card Table),重新标记阶段可以只扫描部分区域。
④并发清除:垃圾回收器删除未被标记的对象,并回收他们占用的内存空间,同样,该步骤也是与应用线程并发执行的
优缺点分析
优点:①低停顿,是以响应时间优先的垃圾回收器
②适用延迟敏感场景:如实时交易系统、Web服务
缺点:①使用的是标记-清除算法,会产生内存碎片
②比较消耗CPU资源的,对处理器资源是比较敏感的,在并发阶段,它不会导致用户线程停顿,但会占用一部分线程(或者说处理器的计算能力)来进行垃圾回收,从而导致应用程序变慢,降低总吞吐量。
G1(Garbage First)
简介
G1,全名叫:Garbage First。是垃圾收集器技术发展历史上的里程碑式的成果,从整体来看是基于标记-整理算法实现的收集器,但从局部(两个Region之间)上看又是基于复制算法实现。开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。所以G1相对于CMS的最主要的两大特点:
①基于Region的内存布局

每一个Region都可以扮演不同的角色,并且当一个对象超过0.5个Region大小的时候,就会被判定为大对象,会放到Humorous区域中
②可预测的停顿时间模型
G1将Region作为单次回收的最小单元,即每次收集到的内存空间都是Region大小的整数倍
G1收集器会去跟踪各个Region里面的垃圾堆积的「价值」大小,价值即回收所获得的空间大小以及回收所需时间的经验值,然后在后台维护一个优先级列表。
每次根据用户设定允许的收集停顿时间(-XX:MaxGCPauseMillis指定,默认值是200毫秒),优先处理回收价值收益最大的那些Region,保证了G1收集器在有限的时间内获取尽可能高的收集效率。
并且对于跨Region之间对象引用是通过在每一个Region中维护一个记忆集RSet去存储对象之间的引用关系
工作流程
①初始标记(STW):标记从 GC Roots 直接可达的对象
②并发标记:根据引用链去标记所有存活对象,使用原始快照方式处理并发期间的对象变化
③最终标记(STW):处理 SATB 中的剩余引用,修正标记结果
④筛选回收(STW):根据用户期望的停顿时间来制定回收计划
优缺点分析
优点:①不会产生内存碎片
②可预测的时间停顿模型
缺点:①内存占用,RSet和卡表会占用一定的内存
②写屏障开销,维护 RSet 和卡表引入额外 CPU 开销。
相关文章:
深入理解三色标记、CMS、G1垃圾回收器
三色标记算法 简介 三色标记算法是一种常见的垃圾收集的标记算法,属于根可达算法的一个分支,垃圾收集器CMS,G1在标记垃圾过程中就使用该算法 三色标记法(Tri-color Marking)是垃圾回收中用于并发标记存活对象的核心算…...
60页PDF | 四川电信数据湖及数据中台实施方案!(附下载)
一、前言 这份报告是关于四川电信数据湖与数据中台实施方案的详细规划。报告从数据驱动、事件管理、数据湖构建、数据资产管理和数据治理等多个方面展开,介绍了如何通过数据湖与数据中台的建设,实现数据的高效采集、存储、分析与共享,提升数…...
短分享-Flink图构建
一、背景 通过简单的书写map、union、keyby等代码,Flink便能构建起一个庞大的分布式计算任务,Flink如何实现的这个酷炫功能呢?我们本次分享Flink做的第一步,将代码解析构建成图 源码基于Flink 2.10,书籍参考《Flink核…...
java常见的几种并发安全问题及解决方案
项目场景: 并发的应用场景,在开发过程会经常遇到。 例如:服务应用启动后,需要简单统计接口的总访问量;实时更新订单状态,成交总额。 问题描述: 比如统计接口访问次数,如下的实现&a…...
【mysql系】mysql启动异常Can‘t create test file localhost.lower-test
1.查看通过下面命令获取对应mysql配置文件 whereis my.cnf 2.查看日志文件 下面这里是对应的错误日志 2025-03-03T06:33:56.402057Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see …...
Docker save命令怎么用
docker save 命令用于将一个 Docker 镜像保存为一个 tar 文件。这在将镜像传输到其他系统或进行备份时非常有用。通过此命令,你可以将镜像导出到本地存储设备或传输给其他人。 基本语法 docker save -o <保存文件路径> <镜像名>:<标签>-o <保…...
物联网的隧道监测场景中,要实现全面且有效的监测
在物联网的隧道监测场景中,要实现全面且有效的监测,需要从传感器选型、数据采集与传输、数据分析模型构建等多个关键环节进行考量。以下是详细的实现方案: 1. 传感器选型 结构安全监测 应变计:用于测量隧道结构表面的应变情况&…...
如何使用 LLM 生成的术语自动在搜索应用程序上构建 autocomplete 功能
作者:来自 Elastic Michael Supangkat 了解如何在 Elastic Cloud 中,通过使用 LLM 生成的词汇,为搜索应用增强自动补全功能,实现更智能、更动态的搜索建议。 自动补全是搜索应用中的一项关键功能,它通过在用户输入时实…...
安全见闻之网络安全新兴术语
在计算机和网络安全领域,随着技术的不断创新与发展,许多新兴的术语和缩写逐渐出现。这些新词汇不仅代表了技术进步,也反映了网络安全应对复杂攻击和防护需求变化的趋势。尤其是在当前网络环境中,由于攻击手段的不断演变࿰…...
vscode离线配置远程服务器
目录 一、前提 二、方法 2.1 查看vscode的commit_id 2.2 下载linux服务器安装包 2.3 安装包上传到远程服务器,并进行文件解压缩 三、常见错误 Failed to set up socket for dynamic port forward to remote port(vscode报错解决方法)-C…...
JVM常用概念之对象初始化的成本
在JVM常用概念之新对象实例化博客中我讲到了对象的实例化,主要包含分配(TLAB)、系统初始化、用户初始化,而我在JVM常用概念之线程本地分配缓冲区(ThreadLocal Allocation Buffer,TLAB)博客中也讲…...
MinIO 容器化快速部署指南
MinIO 容器化快速部署指南 一、快速开始 # 创建网络(需提前执行) docker network create srebro#创建工作目录 mkdir -p /home/application/Middleware/minio/# 启动服务 docker-compose up -d二、配置说明 docker-compose.yaml 结构 services:minio…...
历年杭州电子科技大学计算机考研复试上机真题
历年杭州电子科技大学计算机考研复试机试真题 在线评测:https://app2098.acapp.acwing.com.cn/ 最大公约数和最小公倍数 题目描述 输入两个正整数 m 和 n,求其最大公约数和最小公倍数。 输入格式 两个整数 输出格式 最大公约数,最小公…...
K8S学习之基础十四:k8s中Deployment控制器概述
Deployment控制器概述: Deployment控制器是k8s中最常用的资源对象,为Replicaset和Pod创建提供了一种声明式的定义方法,在Deployment对象中描述一个期望的状态,Deployment控制器就会按照一定的控制速率把实际状态改成期望状态&…...
django中视图作用和视图功能 以及用法
在 Django REST Framework(DRF)中,视图(View)是处理 HTTP 请求并返回响应的核心组件。DRF 提供了多种视图类,适用于不同的场景和需求。以下是 DRF 中常见的视图类及其作用、使用方法的详细说明: 一、DRF 视图的分类 DRF 的视图可以分为以下几类: 基于函数的视图(Func…...
React Native v0.78 更新
这个版本在 React Native 中引入了 React 19,并带来了一些重要的新功能,例如 Android 矢量图(Vector Drawables)的原生支持 以及 iOS 更好的 Brownfield 集成。 亮点 React 19 集成更小更快的发布节奏可选择在 Metro 中启用 Jav…...
记录Linux安装mysql8
1.mysql8安装 yum安装mysql8.0版本_yum 安装mysql8-CSDN博客文章浏览阅读833次,点赞10次,收藏9次。yum安装mysql8.0版本,如果系统中已经安装了旧版本的 MySQL 或者 mariadb,需要先卸载._yum 安装mysql8https://blog.csdn.net/…...
采用OllamaSharp实现.NET快速对接deepseek实现聊天、模型管理、流式响应等功能
1. OllamaSharp 是什么? OllamaSharp 是一个用于在 .NET 环境中与 Ollama API 交互的库。它提供了对 Ollama API 端点的全面支持,包括聊天、模型管理、流式响应等功能,适合需要与 Ollama 服务进行交互的 .NET 开发者。 2. 安装 OllamaSharp…...
CodeBlocks个性化竞赛配置
文章目录 1. 主题设置2. 设置默认代码3. 比赛时的使用 1. 主题设置 参考博客 --> codeblocks更改主题颜色及调试 跟随当前教程配置主题 博主使用的主题为son of obsidian,此主题为黑色背景,按照上边参考博文修改一下光标颜色即可。 效果图࿱…...
如何用单机版deepseek编写示例
以下是一个简单的 DeepSeek 编程示例,通过 API 调用实现智能对话功能:文末有链接 一、环境准备 pip install requests # 安装 HTTP 请求库:ml-citation{ref"2" data"citationList"} 二、代码实现 import requests def chat_wi…...
python实现的可爱卸载动画
在逛掘金时,掘金用户在B站看到的灵感进行的一个卸载窗口的动画效果的实用案例。人类是一种不断在学习的动物,并且是一种模仿能力学习能里比较强的动物。我这里是第三波的学习实践者咯! 相对VUE构建动画效果窗口,我更加喜欢用pytho…...
钣金加工行业数字化转型MES方案
一、 行业痛点:钣金加工行业普遍面临以下挑战: 订单多样化、小批量、定制化需求增多:传统生产模式难以适应快速变化的市场需求。 生产流程复杂、工序繁多:涉及切割、折弯、焊接、表面处理等多个环节,协同效率低。 生产…...
pinginfoview网络诊断工具中文版
介绍 pinginfoview中文版本是一款实用的网络诊断工具,它专为中文用户设计,提供了方便易用的界面,使得在Windows环境下进行ping测试变得更加简单。该工具是由NirSoft开发的一款免费的桌面应用程序,尽管官方可能并未正式发布中文版…...
关于服务器无法下载kcv_encoder.h5权重的解决方法
最近租服务器跑实验代码,在模型初次加载时会下载stable diffusion的一系列预训练权重,但服务器一直卡在 Downloading data from https://huggingface.co/fchollet/stable-diffusion/resolve/main/kcv_encoder.h5 ,最后报错 File /usr/local/…...
计算光学成像与光学计算概论
计算光学成像所涉及研究的内容非常广泛,虽然计算光学成像的研究内容是发散的,但目的都是一致的:如何让相机记录到客观实物更丰富的信息,延伸并扩展人眼的视觉感知。总的来说,计算光学成像现阶段已经取得了很多令人振奋…...
Linux——Docker容器内MySQL密码忘记了如何查看
目录 查看正在运行的MySQL的容器ID 方法一:查看MySQL容器的日志里的密码 方法二:通过环境变量密码登录 方法三:修改密码 查看正在运行的MySQL的容器ID docker ps 方法一:查看MySQL容器的日志里的密码 docker logs [MySQL的容器…...
CSS+Html面试题(二)
一、CSS选择器有哪些,选择器的优先级? 选择器类型:ID选择器、类选择器、标签选择器、通配符、伪类、伪元素、子代选择器、相邻选择器、后代选择器 优先级排序:!important>内联样式>ID选择器>类选择器>标签选择器>…...
Varjo XR-4 混合现实驾驶仿真解决方案
企业级虚拟与混合现实解决方案提供商Varjo今日宣布,其XR-4系列设备已与VI-grade的车辆开发平台VI-WorldSim实现兼容。自2025.1版本起,VI-WorldSim将通过虚幻引擎5的OpenXR接口支持Varjo XR-4系列头显。 VI-WorldSim是一个集成式图形环境,可加…...
Unity3D实现批量修改导入模型设置
系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、应用场景👉1-1、模型导入设置👉二、使用步骤👉壁纸分享👉总结👉前言 不知道你们遇见没有遇见过很多模型的时候,如果一个一个设置模型的设置,那将是一个噩梦。尤其是设置模型的Materials的Location这个…...
颠覆传统软件测试!Browser Use WebUI+DeepSeek:软件测试行业的革命性突破
前置信息 硬件配置 处理器 : Intel(R) Core(TM) i5-8265U CPU 1.60GHz (四核 / 八逻辑处理器) 主板 : 20N8002UCD 内存 : 8GB(RMSA3260ME78HAF-2666 DDR4 2667 MT/s) 显示适配器 : Lexa PRO [Radeon 540/540X/550/550X / RX 540X/550/550X]/WhiskeyLake-U GT2 [UHD Graphics…...
