Go 语言的垃圾回收机制

news2024/9/22 5:23:44
  • Go 语言的垃圾回收机制(Garbage Collection,简称 GC)
  • 1. 垃圾回收的工作原理
  • 2. 并发与回收
  • 3. 优点和缺点
  • 4. 调整和监控
  • 在 Go 语言中,垃圾回收(GC)机制主要通过“引用计数”和“可达性分析”来判断资源是否需要回收。
  • 1. 可达性分析
  • 2. 触发垃圾回收的条件
  • 3. 捡垃圾的标准
  • 对象树
  • 对象树的基本概念
  • 对象树的挂载
  • 对象树与内存管理
  • 4. 影响垃圾回收

Go 语言的垃圾回收机制(Garbage Collection,简称 GC)

是一种自动的内存管理方法,它负责自动释放不再使用的内存,以避免内存泄漏和碎片化。Go 的垃圾回收机制设计目的在于简化开发者的内存管理工作,同时保持程序的高效性。

1. 垃圾回收的工作原理

Go 使用了一种称为标记-清除(mark-and-sweep)的算法进行垃圾回收,这一过程通常包括以下几个步骤:

标记阶段:

GC 从根对象(如全局变量、活跃的 goroutines 和栈上的变量)开始,递归地遍历所有可达对象。

遍历过程中,将所有可以被访问到的对象标记为活跃(即仍然在使用的对象)。

清除阶段:

遍历所有对象,清除未被标记的对象(不再可达的对象),并回收其占用的内存。

2. 并发与回收

Go 的垃圾回收机制是并发的,意味着它能够在程序运行时自动进行垃圾回收,不会暂停整个程序。这种设计减少了“停顿”时间,使其对性能的影响更小。

G1 垃圾回收器(Go 1.5 中引入):支持同时执行的标记和清理过程,从而在后台工作,减少暂停时间。

三色标记法:使用三种颜色(白色、灰色、黑色)来表示对象的状态,以控制标记过程。

3. 优点和缺点

   优点:
   自动内存管理:开发者无需手动管理内存分配和释放,降低了内存泄漏的风险。
   简化开发:简化了代码的复杂性,提高了开发效率。

   缺点:
   性能负担:GC 的开销可能在内存使用高峰期或需要频繁进行回收时引入延迟。
   不可预测的停顿时间:尽管 Go 的 GC 尽量减少停顿时间,但仍然可能在某些情况下导致不可预测的延迟。

4. 调整和监控

Go 提供了一些运行时参数,让开发者可以监控和调整垃圾回收行为,例如:

环境变量 GOGC:用于设置垃圾回收的目标百分比。可以通过调整此变量来影响 GC 的频率,默认值为 100。

运行时监控:可以使用 runtime.ReadMemStats 来获取内存使用情况和 GC 相关的统计信息。

在 Go 语言中,垃圾回收(GC)机制主要通过“引用计数”和“可达性分析”来判断资源是否需要回收。

1. 可达性分析

Go 语言使用的是标记-清除(mark-and-sweep)垃圾回收算法,

其核心思想是通过“可达性分析”来判断哪些对象是仍然可用的,哪些是可以安全回收的。以下是具体步骤:

根对象:GC 从根对象开始,包括全局变量、栈上的变量和正在执行的 goroutine。

对象树遍历:GC 会递归地遍历从这些根对象可达的所有对象(通过指针引用)。在遍历过程中,“标记”所有被访问到的对象为“活跃的”(可用的)。

标记阶段:所有通过根对象可达的对象都被标记,代表它们仍在使用中。

清除阶段:在标记结束后,所有未被标记的对象将被视为不再可用,GC 会释放这些对象占用的内存。

2. 触发垃圾回收的条件

Go 的垃圾回收是自动的,会在特定条件下触发:

内存使用量:内存使用量超过一定的阈值时,垃圾回收会被触发。

Go 使用环境变量 GOGC 来调整垃圾收集的目标百分比,默认值为 100,

即当已分配的内存大小与垃圾回收前的内存使用量的比例达到 100% 时,会触发 GC。

分配新对象:在分配新的对象时,Go 会检查当前的内存使用情况,并可能触发垃圾回收,以确保有足够的内存空间。

手动触发:开发者可以使用 runtime.GC() 函数在代码中手动触发垃圾回收。

3. 捡垃圾的标准

为了判断一个对象是否可以被回收,GC 需要遵循一些标准:

可达性:如果一个对象从根对象不可达,则该对象会被判定为“可回收”。

指针引用:在遍历过程中,如果一个对象包含指向其他对象的引用,GC 会跟随这些指针以标记出所有可达对象。

对象树

“对象树”这个概念通常指的是在内存中由对象(如结构体、切片、映射等)组成的层级结构。

这种结构有助于理解对象之间的关系,以及它们在垃圾回收时如何被标记和管理。

对象树的基本概念

根对象(Root Objects):

垃圾回收从一些称为根对象的起始点开始。根对象通常包括全局变量、栈上的局部变量和正在执行的 goroutines。
任何可以从应用程序的“根”访问到的对象都被称为可达的。

边(Edges):

在对象树中,对象之间通过指向其他对象的指针构成关系。
这些指向其他对象的指针被称为“边”。
每当一个对象列表或切片包含指向其他对象的指针时,就形成了更多的对象层级。

标记和遍历:

在垃圾回收时,GC 理论上会从这些根对象开始,通过访问指针来标记所有与之可达的对象,
以构建出可达性图,再从图中识别出不可达的对象。

对象树的挂载

基本类型变量(如 int, float64, string 等):
当你声明一个基本类型的变量时,它本身不会直接挂载到对象树,
因为基本类型的值不包含对其他对象的引用。基本类型的值是堆栈上简单的原始数据。
var a int = 10 // 基本类型变量不在对象树中

切片、映射、通道、接口、指针等引用类型:
当你声明类似切片、映射或者其他引用类型的变量时,虽然你变量的值在栈上,
但它包含的指针或引用将使它在对象树中占有一席之地。这是因为这些类型指向分配在堆上的数据。
// 切片类型变量,挂载到对象树
slice := []int{1, 2, 3}

对象树与内存管理

挂载到对象树:当一个变量(尤其是引用类型)持有对新的对象的引用时(如切片、映射和结构体),
复杂的对象结构会变得可达,这会影响垃圾回收(GC)机制。

GC 会从根对象开始遍历整个对象树,找到所有可达的对象。

4. 影响垃圾回收

一个变量只要是从根对象可达的,它就会被 GC 标记为活跃。

当你声明的变量不再可达时(例如超出作用域),它最终将被标记为可回收。

此时,变量所持有的任何引用类型的对象也会根据指针关系与其他对象的可达状态决定其存活状态。

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

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

相关文章

重生之我们在ES顶端相遇第15 章 - ES 的心脏-倒排索引

文章目录 前言为什么叫倒排索引数据结构如何生成如何查询TF、IDF参考文档 前言 上一章,简单介绍了 ES 的节点类型。 本章,我们要介绍 ES 中非常重要的一个概念:倒排索引。 ES 的全文索引就是基于倒排索引实现的。 本章内容建议重点学习&…

基于python的api扫描器系统的设计与实现

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

『功能项目』QFrameWork拾取道具UGUI【69】

本章项目成果展示 我们打开上一篇68QFrameWork扔到地上UGUI的项目, 本章要做的事情是实现当物品在地上时,点击物品将对应物品转移到道具栏中 制作一个提示UI界面 添加Button组件设置为点击即将父物体隐藏 拖拽到文件夹中在场景中删除 创建脚本&#xf…

Postman cURL命令导入导出

导入cURL命令 cURL是一种用于发出HTTP请求的流行命令行工具。在测试Web应用程序或API时,cURL使您能够直接从命令行进行交互,使用API开发人员社区中常见的完善语法。如果在不同的地方有多个cURL命令,可以将它们导入Postman。 ​ 将cURL命令导入…

医院伤员消费点餐限制———未来之窗行业应用跨平台架构

一、点餐上限 医院点餐上限具有以下几方面的意义: 1. 控制成本 - 有助于医院合理规划餐饮预算,避免食物的过度供应造成浪费,从而降低餐饮成本。 2. 保障饮食均衡 - 防止患者或陪护人员过度点餐某一类食物,有利于引导合…

游戏淡入淡出效果

一、制作UIdocument 注:是全黑的;并且Picking Mode设置为Igore 通过调节display中的值,实现淡入淡出效果 二、建立空物体 增加uiDocument 拖入相关的物体 注:层级必须设置为最高,此处为20,这个效果必须遮…

(done) 声音信号处理基础知识(5) (Types of Audio Features for Machine Learning)

参考:https://www.youtube.com/watch?vZZ9u1vUtcIA 声学特征描述了声音,不同特征捕捉声音的不同方面性质 声学特征有助于我们构建智能声学系统 声学特征分类有: 1.抽象等级 2.时域视野 3.音乐的部分 4.信号域 5.机器学习方法 如下图展示…

828华为云征文 | 云服务器Flexus X实例:开源项目 LangChain 部署,实例测试

目录 一、LangChain 介绍 二、部署 LangChain 2.1 安装 langchain 2.2 安装 langchain_community 2.3 安装 qianfan 三、实例运行 3.1 Chat Models 3.2 LLMs 3.3 Embedding Models 四、总结 本篇文章主要通过 Flexus云服务器X实例 部署开源项目 LangChain&#xff0c…

【Delphi】通过 LiveBindings Designer 链接控件示例

本教程展示了如何使用 LiveBindings Designer 可视化地创建控件之间的 LiveBindings,以便创建只需很少或无需源代码的应用程序。 在本教程中,您将创建一个高清多设备应用程序,该应用程序使用 LiveBindings 绑定多个对象,以更改圆…

[SAP ABAP] 生成表维护视图

SAP由于数据量较大,很多自定义表都需要通过用户自行去维护,一般可以直接在SE16N对数据字典进行维护数据,但不是每个用户都有其操作权限,而且直接在数据字典上操作数据有很高的风险,因此SAP提供了表维护视图生成器&…

算法学习2

学习目录 一.插入排序 一.插入排序 从数组的第一个元素开始,当前元素与其前一个元素进行比较; 大于(或小于时)将其进行交换,即当前元素替换到前一位; 再将该元素与替换后位置的前一个元素进行交换&#xf…

【全网最全】2024年华为杯研赛A题保奖思路+matlab/py代码+成品论文等(后续会更新完整

您的点赞收藏是我继续更新的最大动力! 一定要点击如下卡片链接,那是获取资料的入口! 点击链接加入【2024华为杯研赛资料汇总】:https://qm.qq.com/q/goQLLNwfgQhttps://qm.qq.com/q/goQLLNwfgQ A 风电场有功功率优化分配思路 这是…

分页插件、代码生成器

01-分页插件、代码生成器 分页插件使用 首先在pom.xml文件中导入依赖 然后再mybatis-config.xml文件中写入插件 在测试类中写入方法 在mybatis.xml文件中设置plugins标签里的属性helperDialectkeyi自动检查当前数据库用的什么,不用设置也行,默认就设置了 分页插件里面属性详解…

XXL-JOB分片概念讲解

3. 分片功能讲解 3.1 案例需求: 1.我们现在实现这样的需求,在指定节假日,需要给平台的所有用户去发送祝福的短信 3.2.编码实现: a.初始化数据 1.在数据库中导入xxl_job_demo.sql数据 b.集成Druid&MyBatis 1.添加依赖 &…

VisualPromptGFSS

COCO-20 i ^i i太大,不建议复现

利士策分享,华为三折叠手机:重塑未来科技生活的里程碑

利士策分享,华为三折叠手机:重塑未来科技生活的里程碑 在这个日新月异的科技时代,华为再次以惊人的创新力,引领我们迈向智能设备的全新纪元——华为三折叠手机, 不仅是技术的飞跃,更是对未来生活方式的一次…

初识set,map

已知快速查找: 1.暴力查找 2.排序二分查找(插入删除麻烦) 3.搜索树->二叉搜索树(极端情况n)->平衡树(AVL树,红黑树)(logn高度太高,搜索次数多)->多叉平衡搜索…

发现编程的全新境界——明基RD280U显示器使用体验

前言 在大学的四年里,我几乎每天都泡在实验室,盯着电脑屏幕,一行行地码代码。那时,学校提供的显示器是非常基础的款式,功能简单,几乎没有任何特别之处,甚至配置也比较低。那个时候,…

【MySQL 01】数据库基础

目录 1.数据库是什么 2.基本操作 数据库服务器连接操作 数据库和数据库表的创建 服务器,数据库,表关系 数据逻辑存储 3.MySQL架构 4.SQL分类 5.存储引擎 1.数据库是什么 mysql&&mysqld: mysql:这通常指的是 MySQL …

PMBOK® 第六版 排列活动顺序

目录 读后感—PMBOK第六版 目录 职场中有句玩笑话:“工作是永远做不完的,任何时候都不可能做完。”这里所吐槽的要点就在于工作任务繁多以及工作缺乏秩序。工作确实是做不完的,倘若工作都能完成,那也就不需要工作了。 工作中令人…