【GoLang基础】垃圾回收是如何工作的?

embedded/2024/10/9 15:15:58/

问题引出:

Go语言中的垃圾回收是如何工作的?

解答:

在 Go 语言中,垃圾回收(Garbage Collection,GC)是自动管理内存的机制,用于在运行时识别和释放不再使用的内存对象,以避免内存泄漏和提高程序的性能。Go 语言的垃圾回收器使用了一种基于标记-清除(mark and sweep)的算法,具体工作流程如下:

1. 标记阶段(Mark Phase)

  • 根对象标记: 垃圾回收器首先从一组根对象(如全局变量、当前调用栈上的变量等)出发,递归地遍历所有可以从根对象访问到的对象,并标记这些对象为活跃对象(reachable)。
  • 并发标记: Go 的垃圾回收器使用并发标记(concurrent marking)的方式,在标记阶段与用户程序并发执行,减少停顿时间。
  • 写屏障(Write Barrier): 在并发标记期间,当程序向一个已标记的对象写入新对象时,会触发写屏障操作,用于确保新对象也被标记为活跃对象。

2. 清除阶段(Sweep Phase)

  • 清除不可达对象: 标记阶段完成后,垃圾回收器会遍历堆中所有内存对象,将未被标记为活跃对象的对象视为垃圾,然后将这些垃圾对象的内存进行回收。
  • 内存回收: 垃圾回收器会将未标记的对象的内存重新加入空闲列表,以供后续分配给新的对象使用。

3. 内存压缩(Optional Compaction)

  • 内存碎片整理: 有些垃圾回收器会在清除阶段之后执行内存压缩(compaction),将存活对象移动到一起,以减少内存碎片,提高内存利用效率。

4. 并发执行

Go 的垃圾回收器设计为与用户程序并发执行,因此在执行垃圾回收时,可以继续进行程序的其他操作,减少了停顿时间,提高了程序的响应性和吞吐量。

触发条件和调优

  • 触发条件: Go 程序的垃圾回收器会在需要释放内存时自动触发,根据内存使用情况和程序的运行状态进行动态调整。
  • 调优: Go 语言提供了一些环境变量和参数,可以用于调整垃圾回收器的行为,如 GOGC 环境变量用于设置触发垃圾回收的阈值。

小结:

Go 语言的垃圾回收器采用了先进的标记-清除算法,并结合并发执行内存压缩等技术,以实现高效的内存管理和自动回收不再使用的内存对象。这种设计使得 Go 程序员无需手动管理内存,提高了编程效率和程序的稳定性。


http://www.ppmy.cn/embedded/40906.html

相关文章

理解安卓系统的三个时间

安卓设备有三种不同的可用时钟: System.currentTimeMillis()SystemClock.uptimeMillis()SystemClock.elapsedRealtime() 一、System.currentTimeMillis() System.currentTimeMillis()是一个标准的“墙”时钟(时间和日期),表示从纪元到现在的毫秒数。该…

Spring学习笔记

目录 1. Spring有什么优势 1.1 模块化 1.2 轻量级 1.3 方便集成各种优秀框架 1.4 提供了分层开发下的完整技术解决方案 1.5 Java语言编写的开源框架,使用了多种设计模式 2. Spring的第一个程序 2.1 开发环境 2.2 环境搭建 2.3 编码测试 2.4 BeanFactory的UML类图…

什么是HTTP/2?

HTTP/2(原名HTTP 2.0)即超文本传输协议第二版,使用于万维网。HTTP/2主要基于SPDY协议,通过对HTTP头字段进行数据压缩、对数据传输采用多路复用和增加服务端推送等举措,来减少网络延迟,提高客户端的页面加载…

springboot 注解(持续更新中)

RequestBody RequestBody将json格式的数据转为java对象(字段名称要一致) RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用RequestBody接收数据时,前端不能…

TypeScript学习笔记:入门指南

介绍 TypeScript 是一个由微软开发的开源编程语言,它是 JavaScript 的超集,添加了静态类型和面向对象的特性,使得 JavaScript 更加适合大型项目的开发。本文将介绍 TypeScript 的基本概念、特点以及其在实际项目中的作用。 特点 静态类型系…

Mysql 隔离级别

MySQL的事务隔离级别是指在处理并发事务时,为保证数据的一致性和事务的独立性,数据库系统提供的不同级别控制策略。根据ACID特性中的隔离性(Isolation),MySQL支持四种标准的事务隔离级别,每种级别有不同的并…

LeetCode 125题:验证回文串

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…

【Stylus详解与引入】

文章目录 Stylus详解与引入一、Stylus简介二、Stylus的特性1. 变量2. 嵌套规则3. 混合(Mixins)4. 函数5. 条件语句和循环 三、Stylus的引入与配置1. 安装Stylus和stylus-loader2. 配置Webpack3. 在Vue项目中使用Stylus4. 编译Stylus代码四、Stylus的性能…