深入理解三色标记、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)是垃圾回收中用于并发标记存活对象的核心算…...
【车规芯片】如何引导时钟树生长方向
12nm车规DFTAPR项目中,我们可以看到,绝大部分的sink都受控于xxxx_tessent_occ_clk_cpu_inst/tessent_persistent_cell_clock_out_mux/C10_ctmi_1这个mux,这是我们DFT设计结果: 这里我们重新打开place的数据 Anchor,也就…...
基于Spring Boot的企业车辆管理系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Spring Boot 中短时间连续请求时出现Cookie获取异常问题
Spring Boot 中短时间连续请求时出现Cookie获取异常问题 一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源 二、问题详细分析1. 场景重现2. 问题分析 三、如何避免影响下一次请求?✅方式 1:在主线程提前复制 …...
轮播图案例
(1)、搭建轮播图的结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>轮播图结构</title><!-- <script src"../js/tools.js"></script> --…...
通俗版解释:分布式和微服务就像开餐厅
一、分布式系统:把大厨房拆成多个小厨房 想象你开了一家超火爆的餐厅,但原来的厨房太小了: 问题:一个厨师要同时切菜、炒菜、烤面包,手忙脚乱还容易出错。 解决方案: 拆分成多个小厨房(分布式…...
【开源-常用C/C++命令行解析库对比】
以下是几种常用的C/C命令行解析库的对比表格,以及它们的GitHub开源库地址: 库名称语言特点是否支持子命令是否支持配置文件是否支持自动生成帮助信息GitHub地址ClaraC11及以上单一头文件,轻量级,非异常错误处理,自动类…...
JavaEE_多线程(一)
目录 1. 为啥要有线程1.1 线程是什么1.2 进程和线程的区别1.3 Java如何进行多线程编程 2 使用线程2.1 创建线程2.2 Thread类的几个常见方法和属性2.2.1 Thread常见构造方法2.2.2 Thread常见属性2.2.3 常见其他方法 2.3 终止一个线程2.3.1 通过共享的标记位来进行沟通2.3.2 调用…...
table 拖拽移动
表格拖拽 Sortable.js中文网|配置 <!-- 教务处 --><template><div class"but"><el-button click"mergeAndPrintArrays()" type"primary">保存数据</el-button><el-button click"restoration()" t…...
【QGIS二次开发】地图显示与交互-01
1. 系统界面设计 设计的系统界面如下,很好还原了QGIS、ArcGIS等软件的系统界面,充分利用了QT中顶部工具栏、菜单栏、底部状态栏,实现了图层管理器、鹰眼图、工具箱三个工具面板。 菜单栏、工具栏、工具箱集成了系统中实现的全部功能&#x…...
Microsoft.Office.Interop.Excel 的简单操作
Microsoft.Office.Interop.Excel 的简单操作 1、安装 Microsoft.Office.Interop.Excel2、声明引用 Microsoft.Office.Interop.Excel3、简单的新建 EXCEL 操作代码4、将 DataGridView 表数据写到 EXCEL 操作代码5、将 EXCEL 表数据读取到 C# 数据表 DataTable 操作代码 1、安装 …...
Debezium日常分享系列之:Debezium 3.0.8.Final发布
Debezium日常分享系列之:Debezium 3.0.8.Final发布 稀疏向量逻辑类型重命名架构历史配置默认值的更改潜在的 Vitess 数据丢失Oracle 的 Reselect 列后处理器行为更改MariaDB 的 SSL 连接 稀疏向量逻辑类型重命名 PostgreSQL 扩展 vector(也称为 pgvecto…...
论传输层的TCP协议和UDP协议scoket通讯
TCP传输前需要三次握手---断开需要四次挥手 谁先发出请求、谁是客户端(client)另一个就是服务器(server)---简称CS架构 现在更多的是BS架构 什么是BS架构? blower server 浏览器服务器---也就是浏览器代替了客户端…...
《鸢尾花数学大系:从加减乘除到机器学习》开源资源
《鸢尾花数学大系:从加减乘除到机器学习》开源资源 Gitee:https://gitee.com/higkoo/ bilibili:https://space.bilibili.com/513194466 GitHub:https://github.com/Visualize-ML...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序📚页面效果📚指令输入定义…...
MySQL——DQL、多表设计
目录 一、DQL 1.基本查询 2.条件查询 3.分组查询 4.排序查询 5.分页查询 二、多表设计 1.一对多 2.一对一 3.多对多 一、DQL 1.基本查询 注意: *号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率) 2.条件查询…...
【文献阅读】The Efficiency Spectrum of Large Language Models: An Algorithmic Survey
这篇文章发表于2024年4月 摘要 大语言模型(LLMs)的快速发展推动了多个领域的变革,重塑了通用人工智能的格局。然而,这些模型不断增长的计算和内存需求带来了巨大挑战,阻碍了学术研究和实际应用。为解决这些问题&…...
玩转大模型——Trae AI IDE国内版使用教程
文章目录 Trae AI IDE完备的 IDE 功能强大的 AI 助手 安装 Trae 并完成初始设置管理项目什么是 “工作空间”?创建项目 管理插件安装插件从 Trae 的插件市场安装从 VS Code 的插件市场安装 禁用插件卸载插件插件常见问题暂不支持安装 VS Code 插件市场中某个版本的插…...
【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.3.1 避免频繁更新(Update by Query的代价)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 Elasticsearch数据更新与删除深度解析:2.3.1 避免频繁更新(Update by Query的代价)案例背景1. Update by Query的内部机制解析1.1 文档更…...
stable-diffusion-webui 加载模型文件
背景 stable-diffusion-webui 安装完毕后,默认的模型生成的效果图并不理想,可以根据具体需求加载指定的模型文件。国内 modelscope 下载速度较快,以该站为例进行介绍 操作步骤 找到指定的模型文件 在 https://modelscope.cn/models 中查找…...
BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab
BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab 目录 BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab分类效果基本介绍BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测一、引言1.1、研究背景和意义1.2、研究现状1.3、研究目…...
SparkStreaming之04:调优
SparkStreaming调优 一 、要点 4.1 SparkStreaming运行原理 深入理解 4.2 调优策略 4.2.1 调整BlockReceiver的数量 案例演示: object MultiReceiverNetworkWordCount {def main(args: Array[String]) {val sparkConf new SparkConf().setAppName("Networ…...
maven高级-05.私服
一.私服...
FFmpeg-chapter2-C++中的线程
1 常规的线程 一般常规的线程如下所示 // CMakeProject1.cpp: 定义应用程序的入口点。 //#include "CMakeProject1.h" #include <thread> using namespace std;void threadFunction(int index) {for (int i 0; i < 1000; i){std::cout << "Th…...
【前端】简单原生实例合集html,css,js
长期补充,建议关注收藏点赞。 目录 a标签设置不一样的花样(图片但不用img)侧边固定box分栏input各种类型iframe表单拖拽 a标签设置不一样的花样(图片但不用img) a标签里面不用嵌套img,直接设置为其bg-img即可 <!DOCTYPE html…...
Linux下的shell指令(一)
作业 1> 在终端提示输入一个成绩,通过shell判断该成绩的等级 [90,100] : A [80, 90) : B [70, 80) : C [60, 70) : D [0, 60) : 不及格 #!/bin/bash read -p "请输入学生成绩:" score if [ "$score" -ge 90 ] && [ "$scor…...
AJAX介绍
XMLHttpRequest get请求使用 const xhr new XMLHttpRequest(); xhr.open("GET", "/data/test.json", true); xhr.onreadystatechange function () {if (xhr.readyState 4) {if (xhr.status 200) {alert(xhr.responseText);} else {console.log("…...
Serilog: 强大的 .NET 日志库
Serilog 是一个功能强大的日志记录库,专为 .NET 平台设计。它提供了丰富的 API 和可插拔的输出器及格式化器,使得开发者能够轻松定制和扩展日志记录功能。在本文中,我们将探索 Serilog 的基础知识、API 使用、配置和一些常见的示例。 1. 日志…...
串口通讯基础
第1章 串口的发送和接收过程 1.1 串口接收过程 当上位机给串口发送(0x55)数据时,MCU的RX引脚接受到(0x55)数据,数据(0x55)首先进入移位寄存器。数据全部进入移位寄存器后,一次将(0x55)全部搬运…...
SSL证书和HTTPS:全面解析它们的功能与重要性
每当我们在互联网上输入个人信息、进行在线交易时,背后是否有一个安全的保障?这时,SSL证书和HTTPS便扮演了至关重要的角色。本文将全面分析SSL证书和HTTPS的含义、功能、重要性以及它们在网络安全中的作用。 一、SSL证书的定义与基本概念 S…...
全国青少年航天创新大赛各项目对比分析
全国青少年航天创新大赛各项目对比分析 一、比赛场地对比 项目名称场地尺寸场地特点组别差异筑梦天宫虚拟三维场景动态布局,小学组3停泊处,初高中组6停泊处;涉及传送带、机械臂、传感器等虚拟设备。初中/高中组任务复杂度更高,运…...
低空监视-无人机专用ADS-B应答机
产品简介 ping200XR是经过TSO适航认证的无人机专用ADS-B应答机,用于中大型无人机的低空监视。将经过认证的航空级航电设备引入无人机系统。该应答机支持航管二次雷达A,C/S模式和ADS-B OUT。重量仅52克满足无人机所面临的尺寸、重量、功耗的挑战…...
【linux】文件与目录命令 - sort
文章目录 1. 基本用法2. 常用参数3. 用法举例4. 注意事项 sort 命令用于对文本文件中的行进行排序,支持按字母顺序、数值大小、特定字段等方式进行排序。默认按字母顺序升序排序。 1. 基本用法 语法: sort [选项] 文件 sort [选项] -o 输出文件 文件功能…...
【工具推荐】在线提取PDF、文档、图片、论文中的公式
网址1:https://simpletex.cn/ai/latex_ocr 网址2: https://www.latexlive.com/home 推荐理由:无需下载,在线使用,直接 截图 CTRLV 效果更佳。...
大模型在垂直行业的落地实践:从通用到定制化的技术跃迁
大模型在垂直行业的落地实践:从通用到定制化的技术跃迁 一、通用大模型的局限性:从 “全能” 到 “专精” 的转型挑战 通用大模型,如 GPT 系列,凭借其强大的自然语言处理能力,在文本生成、语义理解、机器翻译等基础任…...
FPGA开发,使用Deepseek V3还是R1(1):应用场景
以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…...
Docker概念与架构
文章目录 概念docker与虚拟机的差异docker的作用docker容器虚拟化 与 传统虚拟机比较 Docker 架构 概念 Docker 是一个开源的应用容器引擎。诞生于 2013 年初,基于 Go 语言实现。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中…...
算法之数据结构
目录 数据结构 数据结构与算法面试题 数据结构 《倚天村 • 图解数据结构》 | 小傅哥 bugstack 虫洞栈 ♥数据结构基础知识体系详解♥ | Java 全栈知识体系 线性数据结构 | JavaGuide 数据结构与算法面试题 数据结构与算法面试题 | 小林coding...
Mysql学习笔记(六)Django连接MySQL
一、Django中的MySQL驱动程序 Python中常见的MySQL驱动程序: MySQL-python:就是MySQLdb,是对C语言操作MySQL的封装,支持Python2,不支持Python3mysqlclient:MySQL-python的另一个分支,支持Python3pymysql&am…...
手机号码归属地的实现
手机号码归属地查询一般可以通过以下几种方式实现: 1. 使用公开的号码归属地数据库 可以使用国内的手机号码归属地数据库,如: 百度号码归属地开放API阿里云号码归属地API腾讯号码归属地API 你可以在本地存储一个 CSV 或 SQLite 数据库&…...
本地部署 DeepSeek:从 Ollama 配置到 Spring Boot 集成
前言 随着人工智能技术的迅猛发展,越来越多的开发者希望在本地环境中部署和调用 AI 模型,以满足特定的业务需求。本文将详细介绍如何在本地环境中使用 Ollama 配置 DeepSeek 模型,并在 IntelliJ IDEA 中创建一个 Spring Boot 项目来调用该模型…...
2025年渗透测试面试题总结- 阿某云安全实习(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 阿里云安全实习 一、代码审计经验与思路 二、越权漏洞原理与审计要点 三、SSRF漏洞解析与防御 四、教…...
WHAT - 前端异步事件流处理场景梳理
目录 一、典型场景二、解决方案与技术选型1. 基础异步控制2. 状态管理方案3. 复杂任务调度4. 任务取消机制5. 微任务队列优化 三、最佳实践建议四、工具链推荐 前端异步任务流处理是现代Web开发中常见的需求,尤其在复杂业务逻辑、高交互性应用中不可或缺。以下是常见…...
PHP 包含(Include)机制详解
PHP 包含(Include)机制详解 在PHP编程中,include和require是两个非常基础的函数,用于在脚本中包含其他文件。它们在模块化编程中发挥着至关重要的作用,使得代码更易于维护和扩展。本文将详细介绍PHP的包含机制,包括其工作原理、使用方法以及最佳实践。 一、PHP 包含机制…...
Metal学习笔记十:光照基础
光和阴影是使场景流行的重要要求。通过一些着色器艺术,您可以突出重要的对象、描述天气和一天中的时间并设置场景的气氛。即使您的场景由卡通对象组成,如果您没有正确地照亮它们,场景也会变得平淡无奇。 最简单的光照方法之一是 Phong 反射模…...
MongoDB 高级索引
MongoDB 高级索引 摘要 在数据库管理中,索引是提高查询效率的关键因素。MongoDB,作为一款流行的NoSQL数据库,其索引功能尤为强大。本文将深入探讨MongoDB的高级索引特性,包括复合索引、部分索引、文本索引、地理空间索引等,旨在帮助数据库管理员和开发者更好地利用Mongo…...
从DNS到TCP:DNS解析流程和浏览器输入域名访问流程
1 DNS 解析流程 1.1 什么是DNS域名解析 在生活中我们会经常遇到域名,比如说CSDN的域名www.csdn.net,百度的域名www.baidu.com,我们也会碰到IP,现在目前有的是IPV4,IPV6。那这两个有什么区别呢?IP地址是互联网上计算机…...
【JQuery—前端快速入门】JQuery 基础语法
JQuery JQuery是一个快速、简洁且功能丰富的JavaScript框架; 1. 引入依赖 使用JQuery需要先引入对应的库; 在使用 JQuery CDN 时,只需要在 HTML 文档中加入如下代码 <script src"https://code.jquery.com/jquery-3.7.1.min.js"></s…...
即梦AI发布新数字人模型OmniHuman-1
简介 随着人工智能技术的发展,特别是深度学习和自然语言处理的进步,AI在内容创作领域的应用越来越广泛。字节跳动作为一家领先的科技公司,一直在探索如何利用AI技术来提升用户体验和创造力。OmniHuman-1模型正是在这种背景下诞生的ÿ…...
ARM CM3核 压栈流程
STM32F103 使用 ARM Cortex-M3 内核,与 STM32F013(Cortex-M0)相比,其压栈行为有所不同,主要体现在异常自动压栈和**手动压栈(函数调用)**两方面。 1. 进入异常/中断时的自动压栈 当 STM32F103 …...