浅谈Go垃圾回收机制-面试笔记

Go 语言的垃圾回收机制(Garbage Collection,GC)是其内存管理的重要组成部分,以下是相关介绍:

1、基本原理

  • 标记 - 清除算法:Go 语言的垃圾回收主要基于三色标记 - 并发清除算法。首先,从根对象(如全局变量、当前执行函数的局部变量等)开始,递归地标记所有可达的对象。然后,遍历整个堆,清除未被标记的对象,即那些不可达的对象,回收它们占用的内存空间。
  • 三色标记法:为了实现标记过程,Go 使用了三色标记法。将对象分为白色、灰色和黑色。初始时,所有对象都是白色。从根对象开始,将其标记为灰色,放入待处理队列。处理队列中的灰色对象,将其引用的对象标记为灰色,并将自身标记为黑色。重复这个过程,直到队列为空。最后,剩下的白色对象就是不可达的垃圾对象。

2、三色标记法的三种颜色:

  • 白色表示尚未被垃圾回收器访问过的对象,在垃圾回收过程开始时,初始时,所有对象默认都是白色。从根对象出发无法到达的白色对象,最终会被认定为垃圾对象,可以被回收。
  • 灰色代表已被垃圾回收器访问过,但它引用的其他对象尚未全部被访问完的对象。在标记过程中,灰色对象是正在处理的对象,其引用的白色对象会被标记为灰色,并放入待处理的灰色集合中。
  • 黑色表示已被垃圾回收器访问过,并且其引用的所有对象也都已被访问过的对象。黑色对象在本次垃圾回收中被认为是存活的对象,不会被回收。

3、标记过程

  • 初始化:从根对象(如全局变量、栈上的变量等)开始遍历,将根对象标记为灰色,并放入一个待处理的灰色集合中。
  • 标记阶段:从灰色集合中取出一个灰色对象,将其所有直接引用的对象标记为灰色(如果这些对象原本是白色的话),并放入灰色集合中,并将当前对象标记为黑色。不断重复这个过程,直到灰色集合为空。此时,所有可达的对象都被标记为了黑色,而不可达的对象仍然是白色。
  • 并发执行:Go 语言的垃圾回收器在标记阶段与应用程序的执行并发进行,通过将标记工作分解为多个小步骤,与应用程序的执行交替进行,减少标记阶段对应用程序的停顿时间。

根对象?

根对象是指那些可以直接被程序访问到的对象,包括:

全局变量、逃逸的函数局部变量、CPU 寄存器中存储的变

全局变量在程序运行期间通常不会被回收,因为它们在整个程序的生命周期内都处于可达状态

4、清除阶段

        遍历堆中的所有对象,将那些仍然是白色的对象回收,释放它们占用的内存空间。

5、优化策略

  • 分代回收:Go 语言将内存对象分为不同的代,新创建的对象通常在年轻代,经过多次垃圾回收后仍然存活的对象会被晋升到老年代。年轻代的垃圾回收频率较高,因为大多数对象在创建后很快就不再被使用,老年代的回收频率较低。
  • 并发回收:Go 的垃圾回收可以与用户代码并发执行,减少垃圾回收对程序执行的暂停时间。在垃圾回收过程中,大部分工作可以在后台进行,只有在一些关键阶段,如标记开始结束,才需要暂停用户程序,以确保标记的准确性。
  • 写屏障:为了保证在并发垃圾回收过程中对象引用关系的正确性,Go 语言使用了写屏障技术。写屏障在对象的指针被修改时触发,当应用程序修改指针时,写屏障会记录这些修改,以确保 GC 不会遗漏任何可达对象。具体来说,写屏障会将新写入的对象标记为灰色,确保它们在标记过程中被正确访问到。

6、触发条件

  • 定时触发:Go 语言运行时会定期检查是否需要进行垃圾回收,这个时间间隔是动态调整的,根据程序的运行情况和内存使用情况来确定。
  • 内存分配触发:当内存分配达到一定阈值时,也会触发垃圾回收。例如,当新分配的内存超过了当前堆内存的一定比例时,就会启动垃圾回收,以释放一些内存空间。

 

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

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

相关文章

【前端】Visual Studio Code安装配置教程:下载、汉化、常用组件、基本操作

文章目录 一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2、view-in-browser3、Live Server 四、基本操作五、感谢观看! 一、Visual Studio Code下载 下载官网:https://code.visualstudio.com/ 进入官网后点击右上角的Download &…

git推送代码相关学习——(一)

推荐去阅读一下廖老师的git相关的教程https://liaoxuefeng.com/books/git/introduction/index.html 这个系列就来学习一下git操作。 第一步,新建项目 去github中新建一个项目,然后依据项目来进行本地的开发工作。 第二步,拉取项目 git c…

CMS网站模板设计与用户定制化实战评测

内容概要 在数字化转型背景下,CMS平台作为企业内容管理的核心载体,其模板架构的灵活性与用户定制能力直接影响运营效率。通过对WordPress、Baklib等主流系统的技术解构发现,模块化设计理念已成为行业基准——WordPress依托超过6万款主题库实…

Maya基本操作

基本操作 按住ALT键,左键旋转视角,中键平移视角,右键放大缩小视角。 按空格键切换4格视图。 导入FBX格式文件后,无贴图显示。 按6键开启。着色纹理显示 坐标轴相关 修改菜单-左键最上面的虚线。固定修改选项窗口。 选中物体…

政安晨【超级AI工作流】—— 使用Dify通过工作流对接ComfyUI实现多工作流协同

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 目录 一、准备工作 Dify跑起来 ollama局域网化配置 Dify配置并验证 启动ComfyUI 二、…

【蓝桥杯】12111暖气冰场(多源BFS 或者 二分)

思路 这题可以用BFS做,也可以用二分来做。 用二分这里只提供一个思路:对时间来二分查找,check函数就是检查在特定的时间 t 0 t_0 t0​内每一个暖气炉的传播距离能否覆盖所有格子。 用BFS做: 由几个点开始向外扩散,知道…

【云上CPU玩转AIGC】——腾讯云高性能应用服务HAI已支持DeepSeek-R1模型预装环境和CPU算力

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大三学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

【JavaEE】网络编程socket

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

超硬核区块链算法仿真:联盟链PBFT多线程仿真实现 :c语言完全详解版

1 22年年底想用gpt做出一个pbft的算法仿真,到了25年终于可以结合gpt grok perplexcity deepseek等实现了!!!!! 1.1简化版 // 定义 Windows 版本,确保条件变量相关函数可用 #define _WIN32_W…

【并发编程】聊聊forkJoin的原理和最佳实践

对于线程池来说,其实本质就是一个生产者消费者的模式,而通过竞争的方式从队列中获取任务执行。本质上其实就是按照任务级别进行处理,但是对于一些可以分而治之的任务,传统的线程池没有办法分治处理。一是无法对大任务进行拆分&…

【数据预测】基于遗传算法GA的LSTM光伏功率预测 GA-LSTM光伏功率预测【Matlab代码#91】

文章目录 【可更换其他算法,获取资源请见文章第6节:资源获取】1. 遗传算法GA2. 长短期记忆网络LSTM3. 基于GA-LSTM的光伏功率预测4. 部分代码展示5. 运行结果展示6. 资源获取 【可更换其他算法,获取资源请见文章第6节:资源获取】 …

Java 填充 PDF 模版

制作 PDF 模版 安装 OnlyOffice 从 OnlyOffice 官网下载 OnlyOffice Desktop,安装过程很简单,一路下一步即可。用 OnlyOffice 制作 PDF 模版(表单) 使用 OnlyOffice 表单设计器,制作表单,如下图 注意命名…

使用安装 Kettle 教程 Pentoho 10.2.0.0-222 安装 连接mysql

流程 准备下载安装测试链接常见问题 准备 需要提前安装好 JDK 配置好环境变量 (教程看前文) 安装好mysql(教程看前文) 下载好pentaho链接数据库驱动 下载pentaho安装包 https://pentaho.com/wp-content/uploads/2024/04/three-s…

MySQL表的增加、查询、修改、删除的基础操作

MySQL表的增加、查询、修改、删除的基础操作 一、CRUD二、新增数据 insert2.1 单行数据 全列插入2.2 多行数据 指定列插入 三、查询 select3.1 全列查询(select *)3.2 指定列查询3.3 表达式查询3.4 去重:distinct3.5 带有排序的查询&#x…

Windows Server 2025 使用 IIS 搭建 ASP.NET 3.5 网站

开启远程桌面 参考文章Windows server开启远程桌面教程打开服务管理器。ECS 配置安全组,开启 3389Telnet 验证网络联通性 telnet x.x.x.x 338安装 Windows App,登录验证 安装 ASP.NET 3.5 1.参考文章Windows Server 2012安装 .NET Framework 3.5和 Wi…

Linux上位机开发实战(能用的开发板计算资源)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 大家所能想到的嵌入式上位机开发,如果是linux,同时涉及到嵌入式的话,一般都会认为是把pc linux的软件port到板子…

STM32中断

中断的基本概念 中断具体定义:操作系统课程里有清晰的阐述。 STM32中断:中断来了,主程序都得立即暂停,程序由硬件电路自动跳转到中断程序中。中断执行前,进行现场保护;中断执行后,会再还原现场…

maven在windows系统上的详细安装和配置

下载 Maven 安装包 去官网下载,下载链接 下载到指定位置,解压,之后在该目录下新建一个文件夹 【repository】,作为本地仓库 Maven 的配置 配置本地仓库 ① 打开上一步新建的目录 repository, 复制路径 ② 打开 con…

如何为AI开发选择合适的服务器?

选择适合的服务器可以为您的AI项目带来更高的效率,确保最佳性能、可扩展性和可靠性,从而实现无缝的开发与部署。 选择适合的AI开发服务器可能并不容易。您需要一台能够处理大量计算和大型数据集的服务器,同时它还需要符合您的预算并易于管理…

OpenCV中的矩阵操作

OpenCV中的矩阵操作主要围绕Mat类展开,涵盖创建、访问、运算及变换等。 1. 创建矩阵 ‌零矩阵/单位矩阵‌: Mat zeros Mat::zeros(3, 3, CV_32F); // 3x3浮点零矩阵 Mat eye Mat::eye(3, 3, CV_32F); // 3x3单位矩阵 自定义初始化‌&#xff1a…