Go 语言的垃圾回收机制

  • 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.xdnf.cn/news/146872.html

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

相关文章

[Linux] Linux进程PCB内部信息的深入理解

标题:[Linux] Linux进程PCB内部信息的深入理解 个人主页:水墨不写bug (图片来自网络) 目录 一.查看进程 二.认识并了解进程的关键信息 I,PID/PPID II,exe III,cwd 三、fork(&…

设置文件夹用VSCODE右键打开,自己修改注册表不管用,该怎么办

设置文件夹用VSCODE右键打开,自己修改注册表不管用;试了好几次,自己修改注册表的方法不管用。所幸直接下个新版本,覆盖安装,把这两个选项勾上就可以了。

linux-基础知识4

网络连接性测试 ping ping可以用来测试本机与目标主机的连通速度网络稳定性 ping -c 5 -s 1024 目标主机ip地址 -c 表示ping包的个数,linux如果缺省-c会一直ping下去,windows平台的选项是-n -s指定ping发送数据的字节数默认是84字节。windows的是-l 没有问题时会之…

2023国赛C题 蔬菜类商品的自动定价与补货决策(上)

2023国赛C题 蔬菜类商品的自动定价与补货决策(上) 符号说明: 问题1 问题1主要的代码和思路在上一篇文章“数学建模实战块速入门”中已经进行了较为详细的展示,在问题一种要求我们从蔬菜单品和品类两个维度去分析各自之间的关系。…

2024年中国研究生数学建模竞赛C题——解题思路

2024年中国研究生数学建模竞赛C题——解题思路 数据驱动下磁性元件的磁芯损耗建模——解决思路 二、问题描述 为解决磁性元件磁芯材料损耗精确计算问题,通过实测磁性元件在给定工况(不同温度、频率、磁通密度)下磁芯材料损耗的数据&#xf…

学习笔记——MMSR 自适应多模态融合的序列推荐

Adaptive Multi-Modalities Fusion in Sequential Recommendation Systems 前几天当我在阅读这篇论文的时候,在网上找到的相关资料很少,所以当时我读这篇论文的时候特别痛苦,精读了两天半.....所以现在我将自己学习笔记分享出来,…

服务器安全,你必须知道的六个知识点

服务器安全 如今没有什么是安全的。各种系统安全漏洞的数量呈爆炸式增长。令人担忧的主要原因之一是服务器安全性。 接下来,就如何提升服务器安全,写几点见解。 虽然很多企业在服务器的安全性方面做了足够多,但是,黑客仍然能够…

Python数据分析与可视化(Python绘图详解)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

Qt圆角窗口

Qt圆角窗口 问题:自己重写了一个窗口,发现用qss设置圆角了,但是都不生效,不过子窗口圆角都生效了。 无边框移动窗口 bool eventFilter(QObject *watched, QEvent *evt) {static QPoint mousePoint;static bool mousePressed f…

群晖Docker如何修改配置文件(ContainerManager)

群晖Docker与其他linux操作系统的docker启动方式存在差异,默认的Docker配置文件位置也不一样。所以本章教程,主要介绍如何找到群晖Docker下的默认配置文件。 一、登录SSH 为了方便操作,需要开启SSH,并通过SSH链接到群晖NAS主机。登录之后,切换到root用户 sudo -i二、编辑配…

车载测试项目实操学习:CAN通信测试、UDS诊断测试、自动化测试、功能安全测试、CAN一致性测试、HIL测试:9-20

FOTA模块中OTA的知识点:1.测试过程中发现哪几类问题? 可能就是一个单键的ecu,比如升了一个门的ecu,他的升了之后就关不上,还有就是升级组合ecu的时候,c屏上不显示进度条。 2.在做ota测试的过程中&#xff…

企业文档管理系统哪个好?2024年热门的10款文档管理系统软件推荐

在信息化时代,企业每天都会生成海量的文档、数据和资料。 如何有效管理这些文档,确保信息安全、版本控制和协同办公顺畅,是每个企业都必须面对的挑战。 2024年,随着技术的不断进步,市场上涌现出了众多优秀的文档管理…

Selenium自动化测试环境搭建详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 本主要介绍以Java为基础,搭建Selenium自动化测试环境,并且实现代码编写的过程。 1、Selenium介绍 Selenium 1.0 包含 core、IDE、RC、gri…

C++进阶 set和map讲解

set 和 map set 和 multiset set set 类的介绍 set 是基于红黑树实现的有序容器。它的插入、删除、查找操作的时间复杂度均为 O(log n)。遍历时,set 的迭代器按照中序遍历,因此它总是以升序排列元素。 set 的声明如下,T 表示 set 的关键字类…

Kubernetes集群部署(kubernetes)

三台主机恢复到docker快照状态; 检查驱动器类型为sytemd; 设置各个节点的主机名; 然后同步会话,修改hosts文件; 在k8s运行过程中不建议使用交换分区; 关闭交换分区; 但是这种方法是临时性的&am…

JavaSE--零基础的开始笔记02:基础语法--标识符,关键字,变量

一.标识符 Java 语言中,对各种变量、方法和类等要素命名时使用的字符序列称为标识符。 Java 标识符有如下命名规则: 标识符由字母、下划线“_” 、美元符“$”或数字组成。 标识符应以字母、下划线 、美元符开头。 Java 标识符大小写敏感&#xff0c…

【Linux笔记】虚拟机内Linux内容复制到宿主机的Window文件夹(文件)中

一、共享文件夹 I、Windows宿主机上创建一个文件夹 目录:D:\Centos_iso\shared_files II、在VMware中设置共享文件夹 1、打开VMware Workstation 2、选择需要设置的Linux虚拟机,点击“编辑虚拟机设置”。 3、在“选项”标签页中,选择“共…

初识模版!!

初识模版 1.泛型编程1.1 如何实现一个交换函数呢(使得所有数据都可以交换)?1.2 那可以不可以让编译器根据不同的类型利用该模子来生成代码呢? 2.模版类型2.1 模版概念2.2 函数模版的原理2.3 函数模板的实例化2.4 模板参数的匹配原…

【C++初阶】探索STL之——String类的模拟实现

【C初阶】String类的模拟实现 1.string类2.string类的构造和赋值实现3.类的析构实现4.类的iterator5.类的修改(Modify)实现6.类的capacity实现7.类access的实现8.类relational operators的实现9.类find、insert、erase的实现10.operator>>和operat…

官方力荐:LDR6020 PD技术,让Type-C接口充放OTG不再是梦!

PD(Power Delivery)芯片赋能Type-C接口:解锁充电与数据传输的双重魔法 一、PD芯片的科技内核 高速充电与智能数据传输: PD芯片深谙USB Power Delivery规范,支持高功率传输协议,实现快速充电的同时&#x…