浅谈Go垃圾回收机制-面试笔记
Go 语言的垃圾回收机制(Garbage Collection,GC)是其内存管理的重要组成部分,以下是相关介绍:
1、基本原理
- 标记 - 清除算法:Go 语言的垃圾回收主要基于三色标记 - 并发清除算法。首先,从根对象(如全局变量、当前执行函数的局部变量等)开始,递归地标记所有可达的对象。然后,遍历整个堆,清除未被标记的对象,即那些不可达的对象,回收它们占用的内存空间。
- 三色标记法:为了实现标记过程,Go 使用了三色标记法。将对象分为白色、灰色和黑色。初始时,所有对象都是白色。从根对象开始,将其标记为灰色,放入待处理队列。处理队列中的灰色对象,将其引用的对象标记为灰色,并将自身标记为黑色。重复这个过程,直到队列为空。最后,剩下的白色对象就是不可达的垃圾对象。
2、三色标记法的三种颜色:
- 白色:表示尚未被垃圾回收器访问过的对象,在垃圾回收过程开始时,初始时,所有对象默认都是白色。从根对象出发无法到达的白色对象,最终会被认定为垃圾对象,可以被回收。
- 灰色:代表已被垃圾回收器访问过,但它引用的其他对象尚未全部被访问完的对象。在标记过程中,灰色对象是正在处理的对象,其引用的白色对象会被标记为灰色,并放入待处理的灰色集合中。
- 黑色:表示已被垃圾回收器访问过,并且其引用的所有对象也都已被访问过的对象。黑色对象在本次垃圾回收中被认为是存活的对象,不会被回收。
3、标记过程
- 初始化:从根对象(如全局变量、栈上的变量等)开始遍历,将根对象标记为灰色,并放入一个待处理的灰色集合中。
- 标记阶段:从灰色集合中取出一个灰色对象,将其所有直接引用的对象标记为灰色(如果这些对象原本是白色的话),并放入灰色集合中,并将当前对象标记为黑色。不断重复这个过程,直到灰色集合为空。此时,所有可达的对象都被标记为了黑色,而不可达的对象仍然是白色。
- 并发执行:Go 语言的垃圾回收器在标记阶段与应用程序的执行并发进行,通过将标记工作分解为多个小步骤,与应用程序的执行交替进行,减少标记阶段对应用程序的停顿时间。
根对象?
根对象是指那些可以直接被程序访问到的对象,包括:
全局变量、逃逸的函数局部变量、CPU 寄存器中存储的变
全局变量在程序运行期间通常不会被回收,因为它们在整个程序的生命周期内都处于可达状态。
4、清除阶段:
遍历堆中的所有对象,将那些仍然是白色的对象回收,释放它们占用的内存空间。
5、优化策略
- 分代回收:Go 语言将内存对象分为不同的代,新创建的对象通常在年轻代,经过多次垃圾回收后仍然存活的对象会被晋升到老年代。年轻代的垃圾回收频率较高,因为大多数对象在创建后很快就不再被使用,老年代的回收频率较低。
- 并发回收:Go 的垃圾回收可以与用户代码并发执行,减少垃圾回收对程序执行的暂停时间。在垃圾回收过程中,大部分工作可以在后台进行,只有在一些关键阶段,如标记开始和结束时,才需要暂停用户程序,以确保标记的准确性。
- 写屏障:为了保证在并发垃圾回收过程中对象引用关系的正确性,Go 语言使用了写屏障技术。写屏障在对象的指针被修改时触发,当应用程序修改指针时,写屏障会记录这些修改,以确保 GC 不会遗漏任何可达对象。具体来说,写屏障会将新写入的对象标记为灰色,确保它们在标记过程中被正确访问到。
6、触发条件
- 定时触发:Go 语言运行时会定期检查是否需要进行垃圾回收,这个时间间隔是动态调整的,根据程序的运行情况和内存使用情况来确定。
- 内存分配触发:当内存分配达到一定阈值时,也会触发垃圾回收。例如,当新分配的内存超过了当前堆内存的一定比例时,就会启动垃圾回收,以释放一些内存空间。
相关文章:
浅谈Go垃圾回收机制-面试笔记
Go 语言的垃圾回收机制(Garbage Collection,GC)是其内存管理的重要组成部分,以下是相关介绍: 1、基本原理 标记 - 清除算法:Go 语言的垃圾回收主要基于三色标记 - 并发清除算法。首先,从根对象…...
统一开放世界与开放词汇检测:YOLO-UniOW无需增量学习的高效通用开放世界目标检测框架
目录 一、摘要 二、引言 三、相关工作 开放词汇对象检测 开放世界目标检测 参数高效学习 四、高效通用的开放世界目标检测 问题定义 高效的自适应决策学习 开放世界通配符学习 五、Coovally AI模型训练与应用平台 六、实验 数据集 评价指标 实施细节 定量结果 …...
如何给商品一键换色?图生生AI,告别繁琐修图
在电商竞争日益激烈的今天,商品图片的视觉效果直接影响着消费者的购买决策。而商品颜色的展示,更是重中之重!传统的图片换色方式,往往需要耗费设计师大量的时间和精力,从抠图到调色,再到细节调整࿰…...
AIGC-名人语录账号运营创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)...
基于MySQL的创建Java实体Bean和TypeScript实体Bean
基于MySQL的创建Java实体Bean和TypeScript实体Bean 基于MySQL的创建Java实体Bean和TypeScript实体Bean select ORDINAL_POSITION as a, -- Data -- Schema(description "货物管理表") -- TableName("lpg_cargo") -- public class CargoEntity implements…...
10-STL、位运算、常用函数库
1-STL vector vector是变长数组 //定义vector vector<int>a;//第一维长233,第二维长度动态变化 vector<int>b[233];//自定义的结构体类型也可以保存在vector中 struct res{...}; vector<rec>c;//函数 a.size();//返回vector的实际长度…...
练习-班级活动(map存储键值对)
问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名 (n 为偶数) 同学,老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 n 以内的正整数作为 id,第 i 名同学的 id 为 ai。 老师希望…...
纯血鸿蒙:中国操作系统自主创新的里程碑
引言:破局者登场 2024 年 10 月,搭载纯血鸿蒙操作系统(HarmonyOS NEXT)的华为 Mate 70 系列正式发布,首日预约量突破 330 万。这场现象级热度的背后,不仅是消费者对硬件创新的期待,更是中国科技…...
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…...
YOLO魔改之SAM空间注意力模块
基于SAM注意力的YOLOv7改进算法详解(可用于工业检测方案) 一、应用场景说明 本改进算法适用于以下工业检测场景: 复杂背景下的微小目标检测(电子元件缺陷、PCB板焊点)密集目标重叠检测(传送带上的包裹分拣、人群计数)动态环境目标追踪(无人机巡检、自动驾…...
【Java SE】抽象类/方法、模板设计模式
目录 1.抽象类/方法 1.1 基本介绍 1.2 语法格式 1.3 使用细节 2. 模板设计模式(抽象类使用场景) 2.1 基本介绍 2.2 具体例子 1.抽象类/方法 1.1 基本介绍 ① 当父类的某些方法,需要声明,但是又不确定如何实现时ÿ…...
文件相关函数的总结与记忆
1.字符的输入输出 char ch getchar();//不需要传递参数 putchar(a)putc、getc与fputc、fgetc一致 //必须用int接受,因为返回int类型,char因为编译器不同而可能为无符号和有符号 int ch if( (ch getchar() ) ! EOF) 2.行的输入输出 也可以用于二进制…...
SpringBoot有几种获取Request对象的方法
HttpServletRequest 简称 Request,它是一个 Servlet API 提供的对象,用于获取客户端发起的 HTTP 请求信息。例如:获取请求参数、获取请求头、获取 Session 会话信息、获取请求的 IP 地址等信息。 那么问题来了,在 Spring Boot 中…...
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 系列࿰…...
go安装lazydocker
安装 先安装go环境 https://blog.csdn.net/Yqha1/article/details/146430281?fromshareblogdetail&sharetypeblogdetail&sharerId146430281&sharereferPC&sharesourceYqha1&sharefromfrom_link 安装lazydocker go install github.com/jesseduffield/laz…...
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 标准也就是美洲的安全测试标准,因此亚马逊出于对安全的考虑会加强对带电的…...
从实践到创新:低代码驱动教育行业数字化转型
随着数字化转型浪潮席卷教育领域,低代码开发平台因其“低门槛、高效率、强适配”特性,正成为教育行业信息化改革的新工具。本文将结合低代码技术在教育场景中的典型应用案例,分享其对教学管理、科研创新及人才培养模式的变革价值。 一、政策与…...
@AuthenticationPrincipal user null
AuthenticationPrincipal user: null 当使用 AuthenticationPrincipal 注解时,如果注入的 user 为 null,通常是因为以下原因之一: 1. 用户未登录 原因 当前请求没有经过身份验证,Spring Security 的 SecurityContext 中没有用户…...
dfs刷题排列问题 + 子集问题 + 组和问题总结
文章目录 一、排列问题全排列II题解代码 优美的排列题解代码 二、子集问题字母大小写全排列题解代码 找出所有子集的异或总和再求和题解代码 三、组合问题电话号码的字母组合题解代码 括号生成题解代码 组合题解代码 目标和题解代码 组合总和题解代码 总结 一、排列问题 全排列…...
citrix安装部署
在Citrix环境中,特别是在Citrix XenApp或Citrix XenDesktop的部署中,涉及到多个步骤和考虑因素。Citrix是一家提供虚拟化桌面和应用程序解决方案的公司,其产品可以帮助企业实现桌面和应用虚拟化,从而提升灵活性、安全性和管理效率…...
ffmpeg库视频硬编码使用流程
一、硬件编码核心流程 硬件设备初始化 // 创建CUDA硬件设备上下文 AVBufferRef *hw_device_ctx NULL; av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_CUDA, NULL, NULL, 0);// 绑定硬件设备到编码器上下文 codec_ctx->hw_device_ctx av_buffer_…...
996引擎-接口测试:消息Tips
996引擎-接口测试:消息Tips 发送视野内广播消息 sendrefluamsg发送聊天框消息 sendmsg发送地图消息 sendmapmsg打印消息到控制台 release_print发送自定义颜色的文字信息 guildnoticemsg测试NPC参考资料发送视野内广播消息 sendrefluamsg function npc_test_onclick1(player)-…...
【入门初级篇】布局类组件的使用(1)
【入门初级篇】布局类组件的使用(1) 视频要点 (1)章节大纲介绍 (2)布局类组件类型介绍:行布局、列布局、标题 (3)实操演示:列表统计查询布局模型 点击访问my…...
JavaWeb之WebSocket
目录 一、 websocket 概念二、WebSocket原理三、WebSocket特点四、WebSocket应用场景五、Websocket基本使用1、创建Websocket对象2、Websocket事件3、Websocket方法4、前端服务程序 六、聊天室案例1、Tomcat版本:8.0.442、Maven 依赖:3、前端代码4、后端…...
算法2--两数相加
题目描述 解题思路 题目说的很详细了,也就是把每个数倒序写成链表进行输入,然后让你计算两个倒序数组的和,要保证跟预期的结果一样。 首先应该考虑的是两个数组的长度问题,对于链表的每一位进行加法运算,如果两个列表…...
突破边界:Tauri 2.0全局状态管理的原子级实践
精心打造的Tauri 2.0全局状态管理深度指南,融合最新框架特性与企业级实践方案: 一、Tauri 2.0状态管理新范式 1.1 量子态存储模型 #mermaid-svg-paiGRksb0JRQ3TqJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fil…...
