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

news2025/3/22 11:45:56

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

1、基本原理

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

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

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

3、标记过程

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

根对象?

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

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

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

4、清除阶段

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

5、优化策略

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

6、触发条件

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

 

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

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

相关文章

统一开放世界与开放词汇检测:YOLO-UniOW无需增量学习的高效通用开放世界目标检测框架

目录 一、摘要 二、引言 三、相关工作 开放词汇对象检测 开放世界目标检测 参数高效学习 四、高效通用的开放世界目标检测 问题定义 高效的自适应决策学习 开放世界通配符学习 五、Coovally AI模型训练与应用平台 六、实验 数据集 评价指标 实施细节 定量结果 …

如何给商品一键换色?图生生AI,告别繁琐修图

在电商竞争日益激烈的今天,商品图片的视觉效果直接影响着消费者的购买决策。而商品颜色的展示,更是重中之重!传统的图片换色方式,往往需要耗费设计师大量的时间和精力,从抠图到调色,再到细节调整&#xff0…

练习-班级活动(map存储键值对)

问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名 (n 为偶数) 同学,老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 n 以内的正整数作为 id,第 i 名同学的 id 为 ai​。 老师希望…

OpenHarmony 开源鸿蒙北向开发——hdc工具安装

hdc(OpenHarmony Device Connector)是为开发人员提供的用于设备连接调试的命令行工具,该工具需支持部署在 Windows/Linux/Mac 等系统上与 OpenHarmony 设备(或模拟器)进行连接调试通信。简单来讲,hdc 是 Op…

buu-bjdctf_2020_babystack2-好久不见51

整数溢出漏洞 将nbytes设置为-1就会回绕,变成超大整数 从而实现栈溢出漏洞 环境有问题 from pwn import *# 连接到远程服务器 p remote("node5.buuoj.cn", 28526)# 定义后门地址 backdoor 0x400726# 发送初始输入 p.sendlineafter(b"your name…

【Java SE】抽象类/方法、模板设计模式

目录 1.抽象类/方法 1.1 基本介绍 1.2 语法格式 1.3 使用细节 2. 模板设计模式(抽象类使用场景) 2.1 基本介绍 2.2 具体例子 1.抽象类/方法 1.1 基本介绍 ① 当父类的某些方法,需要声明,但是又不确定如何实现时&#xff…

Unix 域套接字(本地套接字)

Unix 域套接字(Unix Domain Sockets),也称为本地套接字(Local Sockets),是一种用于同一主机上进程间通信(IPC)的机制。Unix 域套接字提供了一种高效的进程间通信方式,它利…

Nordic nRF 蓝牙的 Direct Test Mode (DTM) 测试介绍

目录 概述 1. 核心物理层参数 1.1 射频频率 (RF Channel Frequency) 1.2 发射功率 (TX Power) 1.3 调制方式 (Modulation) 1.4 数据包类型 (Packet Type) 1.5 测试模式 (Test Mode) 2. 参数配置方法 2.1 通过 HCI 命令配置 2.2 示例(nRF52 系列&#xff0…

LangChain开发(一)介绍和第一个例子

文章目录 简介LangChain框架组成LangChain库(Libraries)LangChain任务处理流程核心概念1. LLMs2. Chat Models3. 消息(Message)4. 提示(prompts)5. 输出解析器(Output Parsers)6.Ret…

Chrome-Edge-IDEA-Win 常用插件-工具包

Chrome-Edge-IDEA-Win 常用插件-工具包 Chrome-Edge-IDEA-Win 常用插件-工具包谷歌插件chropathJSONViewOctotree - GitHub code treeXPath Helper书签侧边栏篡改猴Print Edit WEEdge浏览器插件IDEA插件CodeGlance Pro 代码迷你缩放图插件Alibaba Cloud ToolkitAlibaba Java Co…

电加热产品亚马逊审核标准UL499报告

很多亚马逊卖家都上架应季产品 像加热垫 加热杯垫 加热毯等产品 都少不了亚马逊UL测试的报告 亚马逊明确要求 电子产品在亚马逊销售就必须需要有UL报告 不然就产品就被有下架的风险。由于 UL 标准也就是美洲的安全测试标准,因此亚马逊出于对安全的考虑会加强对带电的…

从实践到创新:低代码驱动教育行业数字化转型

随着数字化转型浪潮席卷教育领域,低代码开发平台因其“低门槛、高效率、强适配”特性,正成为教育行业信息化改革的新工具。本文将结合低代码技术在教育场景中的典型应用案例,分享其对教学管理、科研创新及人才培养模式的变革价值。 一、政策与…

dfs刷题排列问题 + 子集问题 + 组和问题总结

文章目录 一、排列问题全排列II题解代码 优美的排列题解代码 二、子集问题字母大小写全排列题解代码 找出所有子集的异或总和再求和题解代码 三、组合问题电话号码的字母组合题解代码 括号生成题解代码 组合题解代码 目标和题解代码 组合总和题解代码 总结 一、排列问题 全排列…

996引擎-接口测试:消息Tips

996引擎-接口测试:消息Tips 发送视野内广播消息 sendrefluamsg发送聊天框消息 sendmsg发送地图消息 sendmapmsg打印消息到控制台 release_print发送自定义颜色的文字信息 guildnoticemsg测试NPC参考资料发送视野内广播消息 sendrefluamsg function npc_test_onclick1(player)-…

JavaWeb之WebSocket

目录 一、 websocket 概念二、WebSocket原理三、WebSocket特点四、WebSocket应用场景五、Websocket基本使用1、创建Websocket对象2、Websocket事件3、Websocket方法4、前端服务程序 六、聊天室案例1、Tomcat版本:8.0.442、Maven 依赖:3、前端代码4、后端…

算法2--两数相加

题目描述 解题思路 题目说的很详细了,也就是把每个数倒序写成链表进行输入,然后让你计算两个倒序数组的和,要保证跟预期的结果一样。 首先应该考虑的是两个数组的长度问题,对于链表的每一位进行加法运算,如果两个列表…

Springboot的jak安装与配置教程

目录 Windows系统 macOS系统 Linux系统 Windows系统 下载JDK: 访问Oracle官网或其他JDK提供商网站,下载适合Windows系统的JDK版本。网站地址:Oracle 甲骨文中国 | 云应用和云平台点击进入下滑,点击进入下载根据自己的系统选择&…

Axure大屏可视化模板:赋能多领域,开启数据展示新篇章

在当今这个数据爆炸的时代,数据已经成为各行各业的核心资产。然而,如何高效、直观地展示数据,并将其转化为有价值的决策依据,成为了许多企业和组织面临的共同挑战。Axure大屏可视化模板,作为一款强大的数据展示工具&am…

区块链学习总结

Hardhat 是一个用于 Ethereum 智能合约开发 的开发环境,专为 Solidity 语言编写的智能合约提供工具支持。它能够帮助开发者 编译、部署、测试和调试 智能合约,并提供一个本地的以太坊测试网络。 Hardhat 的核心功能 本地开发网络(Hardhat Ne…

识别并脱敏上传到deepseek/chatgpt的文本文件中的身份证/手机号

本文将介绍一种简单高效的方法解决用户在上传文件到DeepSeek、ChatGPT,文心一言,AI等大语言模型平台过程中的身份证号以及手机号等敏感数据识别和脱敏问题。 DeepSeek、ChatGPT,Qwen,Claude等AI平台工具快速的被接受和使用,用户每天上传的文本数据中潜藏着大量敏感信息,…