Go 语言的垃圾回收机制

news/2024/9/25 12:47:18/
  • 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.ppmy.cn/news/1530284.html

相关文章

Nature Communications|一种快速响应的智能可穿戴嗅觉接口(可穿戴电子/柔性电子/人机交互)

香港城市大学于欣格( Xinge Yu)、北京航空航天大学李宇航(Yuhang Li)、中国特种设备检验研究所赵召(Zhao Zhao)和东京大学Takao Someya团队,在《Nature Communications》上发布了一篇题为“Intelligent wearable olfactory interface for latency-free mixed reality and …

TCP: Textual-based Class-aware Prompt tuning for Visual-Language Model

文章汇总 存在的问题 原文:具有图像特定知识的图像条件提示符号在提升类嵌入分布方面的能力较差。 个人理解:单纯把"a photo of {class}"这种提示模版作为输入是不利于text encoder学习的 动机 在可学习的提示和每一类的文本知识之间建立…

零基础快速构建你的LLM Agent框架,掌握AI的未来!

构建代理时,开发者不仅需要决定使用的模型、用例和架构,还必须选择合适的框架。 是选择经验丰富的 LangGraph,还是尝试新兴的 LlamaIndex 工作流?又或者,走传统路线,完全手动编写代码?为了简化这…

面向对象程序设计原则

面向对象程序设计(Object-Oriented Programming, OOP)是一种编程范式,它通过“对象”来组织代码。这些对象是数据结构(属性)和作用于这些数据的方法(行为)的封装体。为了确保OOP能够有效地促进软…

Chat2DB:AI驱动SQL编辑器,开启智能数据库管理新时代

引言 在当今的开发世界中,数据库是不可或缺的组成部分,而SQL编辑器则是与数据库进行交互的核心工具。尽管市场上已经有诸多SQL编辑器,但真正能做到智能化、易用性和功能完善的产品却屈指可数。Chat2DB作为一款AI驱动的数据库管理和开发工具&…

【网络安全 | 靶机搭建】修改镜像源、更新软件源、安装git、更改python版本等

文章目录 0x00、必要准备0x01、修改镜像源0x02、更新软件源并清除缓存0x03、安装git0x04、更改默认Python版本为python30x05、安装增强功能0x06、vmware虚拟机导出iso0x00、必要准备 安装虚拟机时必须保存用户名、密码,用于后续操作,可以截图保存: 以下内容按个人需要进行配…

常见服务器大全----都是什么?又有何作用?区别联系是什么?---web,应用,数据库,文件,消息队列服务器,Tomat,Nginx,vite.....

Node.js 与 Express Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它允许你在服务器端运行 JavaScript。Express 是一个基于 Node.js 的 Web 应用程序框架,它简化了构建 Web 应用程序和 API 的过程。Express 可以用来创建后端服务器&…

共享单车轨迹数据分析:以厦门市共享单车数据为例(六)

副标题:.基于POI数据的站点功能混合度探究——以厦门市为例 为了保证数据时间尺度上的一致性,我们从互联网上下载了2020年的POI数据,POI数据来源于高德地图 API平台,包括名称、大小类、地理坐标等。并将高德地图 POI数据的火星坐标 系 GCJ-0…