go垃圾回收机制

news/2024/11/13 9:42:02/

Go 语言的垃圾回收(Garbage Collection, GC)机制是其内存管理的核心部分,它负责自动检测并回收不再使用的内存。Go 的垃圾回收机制可以分为以下几个主要类别:

1. 标记(Mark)

  • 根节点垃圾回收从根节点(如全局变量、栈上的变量、寄存器等)开始。
  • 可达性分析:遍历所有可达对象,标记所有活跃的(即仍在使用的)对象。

2. 清除(Sweep)

  • 未标记对象:清除未被标记的对象,即那些不再被任何根节点或活跃对象引用的对象。
  • 内存释放:回收这些未标记对象占用的内存,使其可以被再次分配。

3. 并发执行

  • 与程序并发垃圾回收与应用程序的其他部分并发执行,减少程序的暂停时间。
  • 低延迟:Go 的垃圾回收器设计目标是尽量减少应用程序的暂停时间。

4. 停止世界(Stop-The-World, STW)

  • 标记开始:在垃圾回收的标记阶段开始时,程序的所有 Goroutine 会暂时停止执行,以确保标记的准确性。
  • 短暂停顿:这个“停止世界”的事件非常短暂,Go 团队持续优化以减少其影响。

5. 三色标记法

  • 黑色:已经完成标记的对象。
  • 白色:未被标记的对象,可能包括垃圾。
  • 灰色:已经标记,但其子对象尚未完全标记的对象。

6. 写屏障(Write Barrier)

  • 防止遗漏:在对象引用发生变化时,写屏障确保新引用的对象能够被正确标记。
  • 精确性:写屏障帮助垃圾回收器维护标记的精确性。

7. 分代垃圾回收

  • 新生代对象:新分配的对象被认为是新生代,并且会经历更频繁的垃圾回收
  • 老生代对象:长时间存活的对象被认为是老生代,垃圾回收的频率较低。

8. 垃圾回收触发条件

  • 堆大小阈值:当程序使用的堆内存达到一定的阈值时,会触发垃圾回收
  • 显式触发:通过调用 runtime.GC() 可以显式地触发一次垃圾回收

9. 内存分配策略

  • 分配策略:内存分配策略会根据垃圾回收的历史和当前内存使用情况进行调整。

10. 监控和调优

  • pprof 工具:Go 提供了 pprof 工具来帮助监控和分析内存使用情况。
  • 环境变量:通过设置环境变量(如 GOGCTRACE),可以调整垃圾回收的行为。

11. 垃圾回收优化

  • 优化算法:Go 团队不断优化垃圾回收算法,以提高其效率和减少对程序性能的影响。

12. 用户态与内核态

  • 用户态垃圾回收完全在用户态执行,不依赖于操作系统的内核功能。

Go 的垃圾回收机制设计得既高效又易于使用,它通过自动化内存管理,减少了内存泄漏和其他内存相关错误的风险,同时保证了程序的性能。随着 Go 语言的不断发展,垃圾回收器也在不断优化,以适应更广泛的应用场景。


http://www.ppmy.cn/news/1435499.html

相关文章

OpenHarmony语言基础类库【@ohos.taskpool(启动任务池)】

任务池(taskpool)作用是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。您可以使用任务池API创建后台任务(Task),并对所创建的任…

leetcode刷题笔记——使用双指针处理链表问题

面试的时候经常碰见诸如获取倒数第k个元素,获取中间位置的元素,判断链表是否存在环,判断环的长度等和长度与位置有关的问题。这些问题都可以通过灵活运用双指针来解决 如果存在环,如何判断环的长度呢?方法是&#xff…

java的单元测试和反射

单元测试 就是针对最小的功能单元,编写测试代码对其进行正确性测试 Junit单元测试框架: 可以用来对方法进行测试 有点: 可以灵活的编写测试代码,可以针对某个方法进行测试,也支持一键完成对全部方法的自动发测试&a…

不碎片化学习,尽量用整块的时间系统化学习

从高中毕业之后,我们好像就很难再继续那种系统化的学习,甚至失去了自我知识构建的能力。然而,真正的理解和掌握知识需要深入和连贯,这正是系统化学习的优势所在。 系统化学习的重要性 全面理解:系统化学习能够帮助我…

部署轻量级Gitea替代GitLab进行版本控制(一)

Gitea 是一款使用 Golang 编写的可自运营的代码管理工具。 Gitea Official Website gitea: Gitea的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务。我们采用Go作为后端语言,这使我们只要生成一个可执行程序即…

SQLAlchemy的使用

SQLAlchemy中filter函数的使用 https://blog.csdn.net/m0_67093160/article/details/133318889 创建临时字段 select id , CONCAT(‘内容’) AS fullname from example_table; Pandas数据类型转换_pandas转换数据类型 https://blog.csdn.net/qq_41404557/article/details/125…

设计前后端系统以处理长时间运行的计算任务并提供缓存支持

后端设计 1. 任务队列 创建一个任务队列来存储提交的计算任务。 Component public class TaskQueue {private final Queue<CalculationTask> queue new LinkedList<>();public synchronized void addTask(CalculationTask task) {queue.add(task);}public sync…

【数据结构】树和森林(树和森林的存储结构、树森林二叉树的转换、树和森林的遍历

5.树和森林 5.1 树的存储结构 树的逻辑结构 树是n个结点的有限集合。n0时称为空树。 在任意一棵非空树中应满足&#xff1a; 1&#xff09;有且只有一个特定的根结点&#xff1b; 2&#xff09;当n>1&#xff0c;其余结点可分为m个互不相交的有限集合&#xff0c;每个集合本…