Go

Golang的特性四(Garbage Collection, GC)----垃圾回收机制详解

Royal
2023-07-24 / 0 评论 / 8 阅读 / 正在检测是否收录...

一. 垃圾回收概述
在编程世界中,内存管理一直是一个重要且复杂的话题。手动管理内存,如 C/C++ 中的 malloc/free 或 new/delete,虽然灵活高效,但也容易带来内存泄漏、悬空指针等问题,增加开发难度和风险。为了解决这些问题,垃圾回收(Garbage Collection, GC) 应运而生。
首先,Golang的垃圾回收机制并不像C语言那样让我们自己手动管理内存,也不需要像C++那样通过智能指针来控制内存的生命周期。它自带的垃圾回收机制(GC)会自动帮我们清理那些不再使用的内存,避免了内存泄漏的麻烦。

二. go语言垃圾回收机制详解
Go 语言的垃圾回收机制是一个并发的、三色的、标记-清除(mark-sweep)垃圾回收器。它主要包含以下几个关键点:

  • 并发 : Go 的垃圾回收器与用户程序并发运行,只在必要时进行短暂的停止(STW, Stop The World),最大限度地减少对程序性能的影响。
  • 三色标记 : Go 使用三色标记法来追踪对象之间的引用关系,将对象标记为白色、灰色或黑色,以确定哪些对象可以被回收。
  • 标记-清除 : Go 的垃圾回收器采用标记-清除算法,首先标记所有可达对象,然后清除所有未被标记的对象,释放其占用的内存。

三. 垃圾回收机制详解

三色标记法
三色标记法是一种基于追踪的垃圾回收算法,它将内存中的对象分为三种颜色:

  • 白色 : 表示对象尚未被垃圾回收器访问过,可能是垃圾。
  • 灰色 : 表示对象已经被垃圾回收器访问过,但其引用的对象还没有被访问。
  • 黑色 : 表示对象已经被垃圾回收器访问过,并且其引用的对象也已经被访问。

垃圾回收过程如下:

  • 初始阶段 : 将所有对象标记为白色。
  • 标记阶段 : 从根对象(如全局变量、栈上的变量等)开始,递归地遍历所有可达对象,将其标记为灰色,然后逐步将其标记为黑色。
  • 清除阶段 : 所有仍然为白色的对象都被视为垃圾,将其回收。
    m7j4db9p.png

写屏障
由于 Go 的垃圾回收器与用户程序并发运行,在标记阶段,用户程序可能会修改对象的引用关系,导致错误地回收仍然被引用的对象。为了解决这个问题,Go 引入了写屏障(write barrier) 机制。

写屏障会在用户程序修改指针时,将新引用的对象标记为灰色,确保垃圾回收器能够正确地追踪所有可达对象。

GC 触发时机
Go 的垃圾回收器并不是一直运行的,它会在以下情况下触发:

  • 堆内存达到一定阈值 : Go 会根据当前堆内存的使用情况动态调整 GC 触发阈值。
  • 手动触发 : 可以通过调用 runtime.GC() 函数手动触发 GC。

四. 其他垃圾回收机制
除了 Go 语言使用的标记-清除算法,还有其他一些常见的垃圾回收算法,例如:

  • 引用计数 : 每个对象维护一个引用计数器,当引用计数为 0 时,对象被回收。Python 使用了引用计数机制。
  • 分代收集 : 将对象按照存活时间分为不同的代,对不同代采用不同的回收策略。Java 使用了分代收集机制。

五.总结
Go 语言的垃圾回收机制是其语言设计的一大亮点,它通过并发、三色标记、写屏障等技术,实现了高效、低延迟的自动内存管理,极大地简化了开发者的工作,提高了程序的稳定性和可靠性。

0

评论

博主关闭了当前页面的评论