go-GC垃圾回收

news2025/1/11 18:33:49

GC

GC是自动化内存管理回收机制

虚拟内存函数栈的数据是会根据函数返回而自动销毁的,而堆上的数据是不会随着函数自动销毁的,堆内数据会随着程序运行而逐渐变大,从而导致内存OOM,Go语言就用了GC来清理堆上的内存数据

如何区分垃圾

堆上内存数据不在被栈上和数据段上的引用变量所指向,那就一定 是内存垃圾。这个原理称为"可达性",近似等价于”存活性“

常见垃圾GC方法

  • 引用计数reference counting:php的GC,每个对象都有一个被引用的计数器,每被引用一次则被引用对象计数器+1,当引用对象失效,则被引用对象计数器-1,当计数器是0时,可回收

    • 优点:实时性好,当计数器变0,触发GC清理内存
    • 缺点:当AB对象是嵌套引用,则AB对象的计数器不会变成0,导致无法被回收
  • 标记-清除Mark and Sweep(非移动式垃圾回收):每次启动垃圾回收都会暂停当前所有的正常代码执行,运行一个扫描线程重新运行系统获得链路,通过链路判断对象是否可被触达,如果能触发说明对象当前正在被使用,不可回收;反之,没有触达到的对象则认为无用,可以回收。

    因为GC是清理堆上的数据,那么链路分为2种:

    1. 栈到堆
    2. 数据段到堆
  • 三色标记法:是mark and sweep的优化版,go语言用的此方法

  • 标记-整理 Mark and Compact(移动式垃圾回收):原理和标记清除Mark and Sweep是一样的链路可达性。Mark and Compact会在清理完堆上的内存后将内存重新整合到一起,避免内存碎片过多。可是整理肯定会涉及到内存的迁移和栈上数据的重新指向

  • 复制式移动法(移动式垃圾回收):他同Mark and Compact算法,他会将堆内存上分成2个一样大小的内存区间(from,to)。原来存在from空间的数据,被GC清理后剩余的内存全部存到to空间,from内存清空,避免内存碎片过多。他也是会涉及到内存的迁移和栈上数据的重新指向,并且堆内存只有一半的使用率

  • 分带回收:这里不一一介绍了

移动式垃圾回收 及 会移动堆内存空间,避免内存碎片过多

非移动式垃圾回收 及 不会移动堆内存空间,会有很多内存碎片,产生内存浪费

三色标记法(白,灰,黑)

三种颜色的作用:

  • 白:需要清理的变量
  • 灰:还需要进一波往下追踪变量
  • 黑:追踪完毕,不要清理的对象

三色标记法步骤:

  1. 将内存(栈,堆,数据段)上的所有变量标记为白色
  2. 栈和数据段的变量作为根节点root
  3. 如果根节点变量是值变量标记为黑色,如果是引用变量标记为灰色
  4. 灰色变量是引用变量,他们肯定是会存着堆/栈上的某一个地址。根据这个链路往下查找有3种情况:
    • 如果地址上有数据,并且是值变量,跟节点标记成灰色
    • 链路上的所有节点都标记成黑色
    • 如果地址上没有数据,根节点root上的灰色节点会随着函数返回而释放,那剩余的节点都是白色的,会被GC标记为要清理的内存

GC协程如何进行释放内存

根据时间片段,有多种方式:

  • STW:stop the world,暂停业务进程,GC结束后才继续消费协程
  • 增量式垃圾回收
  • 多协程并发
  • 多协程并行
  • 主体并发式:STW + 多协程并发

STW

STW,stop the world;让程序暂停,GC扫描标记标记GCROOTS的对象引用。会阻塞进程,让系统有卡顿现象。

增量式垃圾回收

将STW切割成多个时间段,让垃圾回收和程序并发执行(交替执行)。但是这个会引起新的问题,就是前一个时间段的GC将节点标记成了黑色,切换到程序后被变量赋值,重新指向了白色,导致下一个时间片的GC把白色节点的内存释放导致OOM。

黑指向白的实例:

  1. GC段1:将一个切片变量a被标记成黑色,栈和堆上都是黑色(切片是引用变量所以存在数据结构堆内,栈存着指针)
  2. 切换到业务程序:创建了一个切片变量b(GC默认节点都是白色,所以此时b的堆栈都是白色节点),切片变量a的pointer被重新赋值指向切片b的七层数组。此时变量a的栈是黑色,堆是白色

强三色不变式解决 增量式垃圾回收时间段GC问题

在这里插入图片描述

不允许黑色节点指向白色对象,在业务程序修改操作时,创建读/写屏障:

  • 写屏障:在修改对象时,通知垃圾回收器,记录到一个集合里(hash或者列表)。GC开始写读集合里的数据,将集合里的黑色节点变成灰色,或者将白色节点变成灰色。这样就可以触发重新扫描到新创建的节点(本该是白色的节点)
  • 读屏障:
    • 移动式垃圾回收 (会移动堆内存空间,避免内存碎片过多):TODO
    • 非移动式垃圾回收 (不会移动堆内存空间,产生内存浪费):不需要读屏障

弱三色不变式解决 增量式垃圾回收时间段GC问题

在这里插入图片描述

所有被黑色对象引用的白色对象都处于灰色保护状态.

多线程并发回收

一个线程进行GC,其他线程进行业务代码的运行。

考虑点:

  1. 写屏障,被GC的读和业务线程的写同时操作,可能会引起读写不一致问题

多线程并行回收

多个线程同一个时间段进行回收。

考虑点:

  • 会引发多线程抢占,所以又要考虑多线程安全锁
  • 如果是移动式垃圾回收,还要考虑多个线程对同一个内存进行复制,导致内存冗余

主体并发式:STW + 多协程并发 + 增量式

在某些特定情况下,仍然需要使用Stop-The-World(STW)来保证线程安全。以下是一些可能需要使用STW的情况:

  1. 根扫描阶段:在垃圾回收的根扫描阶段,需要确保所有的根对象都被正确扫描,并将其标记为活动对象。为了保证扫描的准确性和一致性,可以采用STW来暂停所有用户线程的运行,然后执行根扫描操作。
  2. 内存分配:当进行内存分配时,需要确保内存分配器的内部数据结构状态的一致性。在某些情况下,可能需要通过STW来暂停用户线程并进行内存分配操作,以避免并发访问带来的线程安全问题。
  3. 垃圾回收器的调整和优化:在对垃圾回收器进行调整和优化时,可能需要使用STW来确保对垃圾回收器的修改不会与正在进行的垃圾回收过程产生冲突。这样可以避免并发访问导致的数据不一致性和错误。

go语言GC具体操作

巨人肩膀

https://blog.csdn.net/weixin_42322309/article/details/106915910?spm=1001.2014.3001.5502

https://www.bilibili.com/video/BV1n5411H7qS/?spm_id_from=333.999.0.0&vd_source=6e9548d830b147140ad59cd8010b6e7b

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

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

相关文章

leetcode 2602. 使数组元素全部相等的最少操作次数

给你一个正整数数组 nums 。 同时给你一个长度为 m 的整数数组 queries 。第 i 个查询中,你需要将 nums 中所有元素变成 queries[i] 。你可以执行以下操作 任意 次: 将数组里一个元素 增大 或者 减小 1 。 请你返回一个长度为 m 的数组 answer &#xf…

KCC@大连 | 一场关于开源商业的私享脑暴会

KCC,全称 KAIYUANSHE City Community(中文:开源社城市社区)是由开源社发起,旨在让开源社区在每个城市落地生根的地域性开源组织。 自2023年2月份发起以来,我们已经在南京、上海、深圳、北京、硅谷、新加坡、…

VMware Fusion 13在M2芯片的Mac上安装 Windows 11

首先需要下载Windows 11镜像 以下给出一种官方方法,当然也可以自己去网上搜索,有很多资源 注册微软账号 使用注册的账号登录 访问:https://www.microsoft.com/en-us/windowsinsider/register 使用登录的账号注册Windows 11 Insider Prog…

关于Python数据分析,这里有一条高效的学习路径

无处不在的数据分析 谷歌的数据分析可以预测一个地区即将爆发的流感,从而进行针对性的预防;淘宝可以根据你浏览和消费的数据进行分析,为你精准推荐商品;口碑极好的网易云音乐,通过其相似性算法,为不同的人…

【海报生成器源码】设计海报生成器网站开源源码(更新)

源码简介: 随着社会经济和商业发展,对产品宣传的需求也加大了。如何快速制作海报也成了很大的需求。这里分享的是一个海报生成器网站的最新源代码。 这个海报编辑器有着实用强大的功能,它的最左侧是组件列表。可以在最左侧选择组件,比如文本…

通讯网关软件003——利用CommGate X2Mbt实现Modbus TCP访问OPC Server

本文介绍利用CommGate X2Mbt实现Modbus访问OPC Server。CommGate X2MBT是宁波科安网信开发的网关软件,软件可以登录到网信智汇(wangxinzhihui.com)下载。 【案例】如下图所示,SCADA系统配置OPC Server,现在上位机需要通过Modbus主站软件来获…

基础版本抖音(字节跳动青训)

抖音基础版(字节跳动青训项目) 一、项目介绍 本抖音项目是基于grpc通讯协议开发的高性能微服务,不仅使用gin作为业务层框架,gorm框架作为持久层框架,还使用预编译sql防止sql注入,同时该项目结合连接池技术…

JDK9特性——模块化REPL工具

文章目录 前言模块化模块化案例 可交互的REPL工具 前言 谈到Java9大家往往第一个想到的就是Jigsaw项目(后改名为Modularity)。众所周知,Java已经发展超过20年(95年最初发布),Java和相关生态在不断丰富的同时也越来越暴露出一些问…

ubuntu(20.04)下截图贴图软件——flameshot(带设快捷键)

ubuntu(20.04)下截图贴图软件——flameshot 一、 安装二、打开Flameshot三、截图快捷键设置 windows习惯了用Snipaste的截图和贴图功能,在ubuntu中也有替代品Flameshot。 一、 安装 首先我们进入官网,并点击download。 在这里可…

轻松鲨-AI文案写作 人工智能聊天

轻松鲨AI助手使用地址:http://www.qingsongsha.com?utm_sourcenavigation_website 或前往苹果App Store下载“轻松鲨APP” 支持AI连续对话聊天,帮你解答各种疑问... 让AI帮你画思维导图写文案,提升工作效率... 内置多场景专业模板&#xff0…

[SQL Server]在应使用条件的上下文(在 ‘)‘ 附近)中指定了非布尔类型的表达式,查询时间大于某个数值时

这种条件查询条件里面不要有空格&#xff0c;一个也不要有 这种条件查询条件里面不要有空格&#xff0c;一个也不要有 $giftsDb::table(drawgot)->where(disabtime,<,"2030-01-03")->select();

安卓判断是否是模拟器,适配主流雷电,MUMU,夜神,逍遥

前言 最近游戏项目组又有新的要求&#xff0c;对于数据上报和数据统计接口&#xff0c;尽可能的具体化&#xff0c;比如是否是模拟器&#xff0c;模拟器的型号&#xff0c;品牌等&#xff0c;都要求统计&#xff0c;后续模拟器玩家在活动发放&#xff0c;安全风控等方面也易于…

Linux Spug自动化运维平台公网远程访问---内网穿透

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、文件…

脚本:用python实现五子棋

文章目录 1. 语言2. 效果3. 脚本4. 解读5. FutureReference 1. 语言 Python 无环境配置、无库安装。 2. 效果 以第一回合为例 玩家X 玩家0 3. 脚本 class GomokuGame:def __init__(self, board_size15):self.board_size board_sizeself.board [[ for _ in range(board_…

InfiniBand vs 光纤通道,存储协议的选择

数字时代&#xff0c;数据量爆发增长&#xff0c;企业越来越迫切地追求高吞吐量、低延迟和更高性能的网络基础设施&#xff0c;存储协议的选择变得愈发至关重要。在众多存储协议中&#xff0c;InfiniBand和光纤通道备受关注。本文旨在深入探讨InfiniBand和光纤通道作为存储协议…

python之有限体积法求解一维热传导问题

1、问题描述 考虑均匀发热无限大平板的稳定导热问题&#xff0c;上图中&#xff0c;A、B两面恒温&#xff0c;控制方程为如下形式&#xff1a; 为扩散系数&#xff0c;为材料传热系数&#xff0c;给定厚度&#xff0c;&#xff0c;和分别为100℃和400℃&#xff0c;发热量q为50…

【C++】红黑树插入操作实现以及验证红黑树是否正确

文章目录 前言一、红黑树的插入操作1.红黑树结点的定义2.红黑树的插入1.uncle存在且为红2.uncle不存在3.uncle存在且为黑 3.完整代码 二、是否为红黑树的验证1.IsBlance函数2.CheckColor函数 三、红黑树与AVL树的比较 前言 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在…

气传导耳机什么意思?备受好评的气传导耳机推荐

​气传导耳机是近年来备受关注的一种新型耳机&#xff0c;它采用了独特的设计&#xff0c;将声音通过空气传递到耳朵&#xff0c;从而实现听音乐的效果。与传统的入耳式耳机相比&#xff0c;气传导耳机在听音乐的同时还能听到周围环境声音&#xff0c;提高了安全性和舒适性。如…

开学什么牌子的电容笔质量好耐用?精选4款好用的电容笔

随着新学期开始&#xff0c;我们该准备些什么&#xff1f;随着技术的发展&#xff0c;ipad上出现了各种各样的电容笔。一支好的电容笔&#xff0c;不但可以极大地提升我们的学习效率&#xff0c;也可以极大地提升我们的工作效率。国内厂商生产的这支平替电容笔&#xff0c;无论…

「网页开发|后端开发|Flask」08 python接口开发快速入门:技术选型写一个HelloWorld接口

本文主要介绍为网站搭建后端时的技术选型考虑&#xff0c;以及通过写一个简单的HelloWorld接口快速了解前端和后端交互的流程。 文章目录 本系列前文传送门一、场景说明二、后端语言技术选型三、后端框架技术选型Django 特点Flask 特点FastAPI 特点Tarnado 特点 四、用Flask先…