go-GC垃圾回收

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.mzph.cn/news/79851.shtml

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

相关文章

tomcat架构概览

https://blog.csdn.net/ldw201510803006/article/details/119880100 前言 Tomcat 要实现 2 个核心功能: 处理 Socket 连接,负责网络字节流与 Request 和 Response 对象的转化。加载和管理 Servlet,以及具体处理 Request 请求。 因此 Tomc…

CSS盒子模型

盒子模型的组成 CSS会把所有的HTML元素都看成一个盒子,所有的样式也都是基于这个盒子 content(内容):盒子的内容padding(内边距):用于控制元素内部与边框之间的距离border(边框&…

让NPU跑起来迅为RK3588开发板设置交叉编译器

让NPU跑起来迅为RK3588开发板设置交叉编译器 编译器下载地址是网盘资料“iTOP-3588 开发板\02_【iTOP-RK3588 开发板】开发资料 \12_NPU 使用配套资料\03_编译所需工具\Linux”。 拷贝 gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.gz 到 Ubuntu 的/opt/tool_ch…

分类预测 | MATLAB实现PCA-GRU(主成分门控循环单元)分类预测

分类预测 | MATLAB实现PCA-GRU(主成分门控循环单元)分类预测 目录 分类预测 | MATLAB实现PCA-GRU(主成分门控循环单元)分类预测预测效果基本介绍程序设计参考资料致谢 预测效果 基本介绍 Matlab实现基于PCA-GRU主成分分析-门控循环单元多输入分类预测(完整程序和数据…

八股文学习三(jvm+线程池+锁)

1. jvm (1)概念 JVM是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。 java运行过程: 我们都知道 Java…

C#,数值计算——Hashfn1的计算方法与源程序

1 文本格式 using System; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Hashfn1 { private Ranhash hasher { get; set; } new Ranhash(); private int n { get; set; } public Hash…

TCP IP网络编程(六) 基于UDP的服务器端、客户端

文章目录 一、理解UDP1.UDP套接字的特点2.UDP内部工作原理3.UDP的高效使用 二、实现基于UDP的服务器端、客户端1.UDP中的服务端和客户端没有连接2.UDP服务器端和客户端均只需要一个套接字3.基于UDP的数据I/O函数4.基于UDP的回声服务器端、客户端5.UDP客户端套接字的地址分配 三…

IDEA中创建Java Web项目1

一、File-> New -> Project... 1. 项目类型中选择 Java Enterprise 项目 2. Name:填写自己的项目名称 3. Project template:选择项目的模板,Web application。支持JSP和Servlet的项目 4. Application server:选择应用服务…

【C++11保姆级教程】列表初始化(Literal types)和委派构造函数(delegating))

文章目录 前言一、列表初始化 (List Initialization)1.1数组初始化1.2结构体初始化1.3容器初始化1.4列表初始化的优势 二、委派构造函数 (Delegating Constructors)2.1委派构造函数是什么?2.2委派构造函数示例代码2.3调用顺序2.3委派构造函数优势 总结 前言 C11引入…

MySQL基础运维知识点大全

一. MySQL基本知识 1. 目录的功能 通用 Unix/Linux 二进制包的 MySQL 安装下目录的相关功能 目录目录目录binMySQLd服务器,客户端和实用程序docs信息格式的 MySQL 手册manUnix 手册页include包括(头)文件lib图书馆share用于数据库安装的错…

数据结构-leetcode-数组形式的整数加法

解题图解: 下面是代码: /*** Note: The returned array must be malloced, assume caller calls free().*/ int* addToArrayForm(int* num, int numSize, int k, int* returnSize){int k_tem k;int klen0;while(k_tem){//看看k有几位k_tem /10;klen;}i…

激活函数总结(三十五):激活函数补充(KAF、Siren)

激活函数总结(三十五):激活函数补充 1 引言2 激活函数2.1 KAF激活函数2.2 Siren激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swish、ELU、SELU、GELU、Softmax、Softp…

Ubuntu 22.04.3 LTS安装

最近换电脑了,准备重新装一下ubuntu。多年前装过ubuntu很老的版本,现在发现官网最新的LTS版本是 Ubuntu 22.04.3 LTS 版本。那重新装的话,肯定装最新的版本了。这里我记录下自己的安装过程,作为以后的笔记查看。 我的环境&#x…

【Linux】生产者消费者模型

文章目录 一、生产者消费者模型1. 生产者消费者模型的概念2. 生产者消费者之间的关系3. 生产者和消费者的特点 二、基于BlockingQueue的生产者消费者模型1. 单生产单消费随机数任务计算器任务Task 2. 多生产多消费3. 为什么生产者消费者模型高效 三、基于环形队列的生产消费模型…

c++中关于Thread Affinity(线程亲和性)示例源码

win10下,可以在任务管理器里面设置某个进程的线程亲和性,如下图: 然后选择相关的cpu,如下图: 这么做可以使得相关的线程在某些密集型计算任务中只会运行在某些指定的cpu上,以便提高性能。 以下是windwos上c程序中应用Thread Affi…

腾讯mini项目-【指标监控服务重构】2023-08-20

今日已办 PPT制作 答辩流程 概述:对项目背景、架构进行介绍(体现我们分组的区别和需求)人员:小组成员进行简短的自我介绍和在项目中的定位,分工进展:对项目进展介绍,其中a、b两组的区别和工作…

STM32——SPI通信

文章目录 SPI(Serial Peripheral Interface)概述:SPI的硬件连接:SPI的特点和优势:SPI的常见应用:SPI的工作方式和时序图分析:工作模式传输模式与时序分析工作流程 SPI设备的寄存器结构和寄存器设…

Linux四种I/O模型

一.四种模型 阻塞式IO,非阻塞式IO,信号驱动IO,IO多路复用 二.阻塞式IO 特点:最简单,最常用,效率低 阻塞I/O 模式是最普遍使用的I/O 模式 系统默认状态,套接字建立后所处于的模式就是阻塞I/O 模式…

国家网络安全周2023时间是什么时候?有什么特点?谁举办的?

国家网络安全周2023时间是什么时候? 2023年国家网络安全宣传周将于9月11日至17日在全国范围内统一开展。其中开幕式等重要活动将在福建省福州市举行。今年网安周期间,除开幕式外,还将举行网络安全博览会、网络安全技术高峰论坛、网络安全微视…

【Git】万字git与gitHub

🎄欢迎来到边境矢梦的csdn博文🎄 🎄本文主要梳理在git和GitHub时的笔记与感言 🎄 🌈我是边境矢梦,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以关注一下🫰&…