垃圾回收 中 三色标记法 内存屏障 原理流程

Go 语言GC原理概述 GC GC 这个问题,Java 开发者应该十分熟悉, GC 是一种自动管理内存的机制,垃圾回收器尝试回收程序不使用的对象与占用的内存。 GO 语言的 GC golang-GC 是基于标记-清除 的三色标记法。 黑、灰 、白 黑色:该对象已经被标记过了,且对象下的属性也全部被标记过了 灰色:该对象已经被标记过了,但该对象下的属性没有完全被标记(GC 需要从对象中寻找垃圾) 白色:该对象没有被标记过(对象垃圾) GC过程 其实跟 Java 中的有点类似。 Stack Scan : 收集根对象(全局变量和 阅读详情

**三色标记法(Tri-color Marking)**是垃圾回收算法中一种常用的对象标记方法,它用于追踪活动对象(即还在使用的对象)和非活动对象(可以被回收的对象)。三色标记法将对象分为三种颜色:白色、灰色和黑色。

  • 白色:表示对象尚未被垃圾回收器访问过。
  • 灰色:表示对象已被访问,但其子对象(即引用该对象的对象)可能尚未被访问。
  • 黑色:表示对象已被访问,并且其所有子对象也已被访问。

三色标记法的流程:

  1. 初始阶段:将所有对象初始化为白色。设置一组初始根对象(例如栈上的对象、静态变量等)为黑色。

  2. 标记阶段:从黑色对象开始,递归地访问它们的子对象,将白色对象标记为灰色,并将灰色对象的子对象也标记为灰色。当遇到一个黑色对象的子对象时,该子对象及其子对象都已经被访问过,因此不需要再次标记。

  3. 清除阶段:所有未被标记(即仍然是白色)的对象都是非活动对象,可以被安全地回收。

内存屏障(Memory Barrier):

内存屏障(有时也称为内存栅栏或屏障指令)是一种处理器指令,用于确保某些操作的执行顺序。在垃圾回收的上下文中,内存屏障用于确保标记阶段的可见性和一致性。由于现代计算机体系结构中,处理器通常使用缓存来提高性能,这可能导致不同处理器核心之间的数据不一致。内存屏障可以确保在垃圾回收期间,所有处理器核心都能看到一致的对象标记状态。

内存屏障有多种类型,每种类型都有其特定的用途。在垃圾回收中,通常会使用以下几种类型的内存屏障:

  • 写屏障(Write Barrier):在写入操作(如赋值)之后插入的内存屏障,确保写入操作对其他处理器可见。
  • 读屏障(Read Barrier):在读取操作之前插入的内存屏障,确保读取操作看到的是最新的数据。
  • 全屏障(Full Barrier):同时确保读写操作的可见性。

流程中的内存屏障应用:

在垃圾回收期间,写屏障用于确保当一个对象从一个集合中被移除(例如从一个数据结构中删除或修改其引用)时,垃圾回收器能够立即知道这个变化。这有助于垃圾回收器避免错误地标记本应被回收的对象。

读屏障则用于确保在标记阶段,当一个线程读取对象的引用时,它看到的是最新的标记状态。这有助于确保垃圾回收的准确性和一致性。

内存屏障的使用会增加一定的性能开销,但它们对于确保垃圾回收的正确性和效率至关重要。现代JVM实现通常会根据应用程序的特点和硬件架构选择适当的内存屏障策略。

CVE-2021-3156本地提权漏洞复现 受影响版本 sudo: 1.8.2 - 1.8.31p2 sudo: 1.9.0 - 1.9.5p1 测试 我这里是在本地centos7上进行测试。 需要目标机器上存在python编译器、目标主机出网或者能上传文件到目标主机。 以非root用户登录系统,并运行如下命令: sudoedit -s / 通常响应一个以 sudoedit: / 开头的报错,多半存在漏洞。 利用 提权脚本: https://www.o2oxy.cn/wp-content/uploa 阅读详情

相关推荐

实战篇【2】-H3C防火墙开局基础配置

本篇文章为“H3C防火墙开局基础配置”,主要涵盖配置管理地址、聚合端口、安全区域、安全策略、静态路由、ACL,WEB和SSH远程管理、Console、SNMP、NTP时钟、日志主机等内容,对比交换机配置开局,增加两处配置,安全区域和安全策略。方便调试人员远程管理、调试。

weixin_47402139的博客 1万+

JavaScript-垃圾回收机制(GC)

垃圾回收的几种方式:标记清除法、引用计数法、分代式垃圾回收

十二的博客 8497

CentOS8静默安装Oracle11.2.0.1

背景 新安装oracle,用静默安装方式就不需要安装图形界面了,省时省力。 前期准备工作与图形化安装一样,如创建用户|用户组、环境变量、内核参数、创建目录等. 可参考图形化安装,链接:https://blog.youkuaiyun.com/heroicpoem/article/details/104229369 环境 平台 版本 操作系统 centOS 8 Oracle 11gR2 1.响应文件 响应文件的内容就是图形化安装时手工设置的选项内容。 解压后,database/response/db

heroicpoem的专栏 4518

关于三色标记算法的理解

三色标记算法理解

simpleGq的专栏 390

Optisystem软件与Matlab软件的联合数据读取

目录 Matlab软件程序编写 Optisystem软件的连接与设置 数据读取结果 Matlab软件程序编写 利用Matlab软件按照下图编写程序,保存为getdata.m文件。 OutputPort1 =InputPort1; fileID=fopen('OSAdata.txt','wt'); fprintf(fileID,'%f\n',OutputPort1.Sampled.Signal); fclose(fileID); Optisystem软件的连接与设置 (以基于线性插值法

Vivian_Chen_的博客 4853

STM32通过ESP8266连接机智云APP(第二讲,烧录固件并测试)

今天与大家分享STM32通过ESP8266连接机智云APP,并完成数据的上传下发第二讲。带大家一起烧录机智云固件到ESP8266并且将其通过机智云串口助手与APP进行测试。

qq_63267523的博客 1425

三色标记法与写屏障(WriteBarrier)

GC算法从整体思路上来讲基本只有两大流派,即引用计数派和扫描标记派。而扫描标记派又分为可并行方式和不可并行方式。三色标记法就是可并行方式最常用的一种扫描标记方法。网上对于三色标记法的详细介绍多如牛毛,本文重点不在这里,所以只简单介绍一下原理。本文其实没有重点。

zhiai315的博客 2427

意图识别和纠错问题

可想而知,错误的意图识别会带来多大的负面影响。基于词典,就是对用户query内容和词典内容进行比对,比较常见的方式是序列标注问题里用的最大逆向匹配,通过这种方式找到词典里的实体词,匹配触发了自然就有意图了,而在词典匹配的时候,不是使用链表之类的来构造匹配结构,而是使用搜索树的结构,这种匹配的复杂度最低,速度也快,两者结合,其速度甚至比很多模型要快得多(基本上1ms以内就能完成),fasttext速度非常快,但是textcnn之类的其实就已经达到ms级别以上,bert甚至在10ms级别。

TURING.DT 4571

三色标记法详细图解

前言: 了当前主流编程语言的垃圾收集器基本上都是依靠可达性分析算法来判定对象 是否存活的,可达性分析算法理论上要求全过程都基于一个能保障一致性的快照中才能够进行分析, 这意味着必须全程冻结用户线程的运行。 在根节点枚举这个步骤中,由于GC Roots相比 起整个Java堆中全部的对象毕竟还算是极少数,且在各种优化技巧(如OopMap)的加持下,它带来 的停顿已经是非常短暂且相对固定(不随堆容量而增长)的了。可从GC Roots再继续往下遍历对象 图,这一步骤的停顿时间就必定会与Java堆容量直接成正比.

m0_53611007的博客 5447

python 编程 安卓脚本_详解基于Android的Appium+Python自动化脚本编写

1.AppiumAppium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试, 它使用WebDriver协议驱动iOS,Android和Windows应用程序。通过Appium,我们可以模拟点击和屏幕的滑动,可以获取元素的id和classname,还可以根据操作生成相关的脚本代码。下面开始Appium的配置。appPackage和APPActivity的获取任意下载一个app解压...

weixin_39523625的博客 2928

使用FPGA实现MIPI DSI接口

通过使用FPGA,我们可以实现MIPI DSI接口,并在FPGA上生成相应的时序和电平转换电路。通过使用FPGA,我们可以实现MIPI DSI接口,并在FPGA上生成相应的时序和电平转换电路。在本文中,我们将探讨如何使用FPGA实现MIPI DSI接口,并提供相应的源代码。根据不同的发送状态,我们设置相应的输出信号。请注意,这只是一个基本的示例,用于说明如何使用FPGA实现MIPI DSI接口的发送功能。请注意,这只是一个基本的示例,用于说明如何使用FPGA实现MIPI DSI接口的发送功能。

ZdqDeveloper的博客 1695

三色标记算法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

TNT的博客 333

C++软件异常分析概述

本文将详细讲述Windows系统中软件异常的分类以及常用的排查方法,给大家提供一个借鉴与参考。

dvlinker的技术专栏 4万+

Golang原理剖析(Go语言垃圾回收GC)

GC(垃圾回收)是编程语言实现的内存自动管理机制,主要用于回收堆上不再使用的内存。文章介绍了GC的必要性,分析了手动内存管理容易导致的悬挂指针问题,以及常见GC算法(引用计数法、标记清除法、复制法、标记整理法、分代法)的优缺点。Go语言采用并发三色标记法加屏障技术实现GC,未采用分代和标记整理算法,主要因其基于TCMalloc的内存分配机制已有效降低碎片率,且通过逃逸分析将部分对象分配在栈上,减少了GC压力。

Atticus的博客 2017

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

GO GC(垃圾回收)

GO GC(垃圾回收),标记清除,三色标记,写屏障,STW,白色,灰色,黑色,通道和协程的垃圾回收

weixin_39171666的博客 2284

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Go-gc垃圾回收机制

首先要进行STW(stop the word - 程序暂停)标记清除算法(Mark Sweep Algorithm),包括标记(Mark)和清除标记阶段:从根对象开始,查找并标记堆中所有存活的对象清除阶段:遍历堆中所有对象,回收未被标记的对象三色标记法将程序中的对象分为三类:白色、灰色和黑色白色:在回收开始阶段,所有对象都标记为白色;在回收结束后,所有白色对象均不可达,其内存将被释放灰色:已被垃圾收集器访问到的对象,是一种中间状态。

qq_69147787的博客 840

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

go内存逃逸和GC(垃圾回收)工作原理

首先将根对象标记为灰色,加入灰色集合,垃圾搜集器取出一个灰色对象,将其标记为黑色,并将其指向的对象标记为灰色,加入灰色集合。为了解决这个问题,Go 使用了内存屏障技术,它是在用户程序读取对象、创建新对象以及更新对象指针时执行的一段代码,类似于一个钩子。但在标记和用户程序并发执行过程中,用户程序删除了 C 对 D 的引用,而 A 获得了 D 的引用。标记清除算法的一大问题是在标记期间,需要暂停程序(Stop the world,STW),标记结束之后,用户程序才可以继续执行。

maybe的博客 877

简述 Go 语言GC(垃圾回收)的工作原理

简述 Go 语言GC(垃圾回收)的工作原理 最常见的垃圾回收算法有标记清除(Mark-Sweep) 和引用计数(Reference Count),Go 语言采用的是标记清除算法。并在此基础上使用了三色标记法和写屏障技术,提高了效率。 标记清除收集器是跟踪式垃圾收集器,其执行过程可以分成标记(Mark)和清除(Sweep)两个阶段: 标记阶段 — 从根对象出发查找并标记堆中所有存活的对象; 清除阶段 — 遍历堆中的全部对象,回收未被标记的垃圾对象并将回收的内存加入空闲链表。 标记清除算法的一大问题是在标记

qq_53267860的博客 827

【Golang】有关垃圾收集器的笔记

本文主要介绍了Golang中垃圾回收的部分机制

#include>的博客 1153

Go垃圾回收机制

传统的系统级编程语言(主要指C/C++)中,程序员必须对内存小心的进行管理操作,控制内存的申请及释放。稍有不慎,就可能产生内存泄露问题,这种问题不易发现并且难以定位。 C++通过指针引用计数来回收对象,但是这不能处理循环引用。为了避免引用计数的缺陷,后来出现了标记清除,分代等垃圾回收算法。 过去一般采用两种办法: 1、内存泄露检测工具: 这种工具的原理一般是静态代码扫描,通过扫描程序检测可能出现内存泄露的代码段。然而检测工具难免有疏漏和不足,只能起到辅助作用。 2、智能指针: 这是 c++ 中引

yanghaitao5000的博客 495

GC垃圾回收(3)- 三色标记算法

1. CMS CMS过程在上篇文章 GC垃圾回收(2) 中已经写过。 它分为四个阶段: 1 initial mark (初始标记) 2 concurrent mark (并发标记) 3 remark (重新标记) 4 concurrent sweep (并发清理) 其中 并发标记 阶段会有漏标的问题,为解决这个问题,采用了 “三色标记算法” 2. G1 G1 GC(Garbage First Garbage Collector)是一种服务端应用使用的垃圾收集器,目标是用在 多核、大内存的机器上,它

qq_44503377的博客 2137

【内存的垃圾回收】:揭秘ZGC与Shenandoah低延迟回收器的底层秘密

深入解析内存的垃圾回收机制,揭秘ZGC与Shenandoah如何实现毫秒级停顿。适用于高并发低延迟场景,采用并发标记与读屏障技术,显著提升应用响应速度。了解底层原理,优化JVM性能,值得收藏。

LogicShoal的博客 1032

【Golang】高性能编程之垃圾回收机制

1. Go 语言GC(垃圾回收)的工作原理 最常见的垃圾回收算法有标记清除(Mark-Sweep) 和引用计数(Reference Count),Go 语言采用的是标记清除算法。并在此基础上使用了三色标记法和写屏障技术,提高了效率。 标记清除收集器是跟踪式垃圾收集器,其执行过程可以分成标记(Mark)和清除(Sweep)两个阶段: 标记阶段 — 从根对象出发查找并标记堆中所有存活的对象; 清除阶段 — 遍历堆中的全部对象,回收未被标记的垃圾对象并将回收的内存加入空闲链表。 标记清除算法的一大问题

Kaimar的博客 1612

图解CMS原理是什么?漏标+多标+浮动垃圾 如何解决?

对于分代垃圾回收器,势必存在一个跨代引用的问题,而卡表就是最常用的一种跨代引用 记录结构 ,它是一个字节数组,用于记录堆内存的映射关系,下面是 HotSpot虚拟机默认的卡表标记逻辑:[图片]在 CMS 垃圾收集器里,卡表主要用来记录老年代对年轻代的引用,以此加速年轻代垃圾收集(YGC)进程。YGC 时,卡表能快速锁定可能引用年轻代对象的老年代对象,不用扫描整个老年代,提升了效率。但在 Full GC 场景下,卡表作用有限。

未来的那个你 1479

GOGC到底设多少才合适?(Go垃圾回收配置深度揭秘)

深入解析Go垃圾回收配置中GOGC的最佳设置策略,帮助开发者平衡性能与内存占用。涵盖不同场景下的调优方法、触发机制及实测效果对比,提升应用运行效率。掌握核心配置技巧,值得收藏。

DebugVibe的博客 854

007-JVM垃圾回收器

标记清除 1、把无用的内存标记 2、清除标记内存,清除只是把内存的起始结束地址做一个记录即可,不需要别的处理 优点:速度快 缺点:容易产生内存碎片,如果此时插入一个数组对象,实际内存空间够用,但是由于各自不连续,导致数组对象无法存储 标记整理 1、标记无效内存 2、删除无效内存并重新排布内存对象,避免了碎片产生,但由于要把有用的内存对象前移,因此要改动内存和对象引用,导致速度慢 优点:防止内存碎片 缺点:速度慢 ...............

qq_36777191的博客 1万+
上一篇: 线程池 futuretask forkjoin 使用场景区别
下一篇: jvm 内存分布 1.7 1.8 区别
vmaps
博客等级 码龄17年 424粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值