Go 语言GC(垃圾回收)的工作原理

Go语言的垃圾回收(Garbage Collection,简称GC)机制是一种自动的内存管理方法,它负责自动释放不再使用的内存,以避免内存泄漏和碎片化。Go语言的GC工作原理主要基于标记-清除(mark-and-sweep)算法,并经过多次优化,以在程序运行时有效地完成内存管理任务。以下是Go语言GC工作原理的详细解释:

一、标记-清除算法

  1. 标记阶段

    • GC从根对象(如全局变量、活跃的goroutines和栈上的变量)开始,递归地遍历所有可达对象。
    • 遍历过程中,将所有可以被访问到的对象标记为活跃(即仍然在使用的对象)。
  2. 清除阶段

    • 遍历所有对象,清除未被标记的对象(不再可达的对象),并回收其占用的内存。

二、三色标记法

为了优化标记过程,Go语言使用了三色标记法。这种方法将对象分为三种颜色:白色、灰色和黑色,以控制标记过程。

  1. 白色对象:潜在的垃圾,表示还未搜索到的对象,其内存可能会被垃圾收集器回收。
  2. 灰色对象:活跃的对象,表示正在搜索但还未搜索完的对象,因为存在指向白色对象的外部指针,垃圾收集器会扫描这些对象的子对象。
  3. 黑色对象:活跃的对象,表示搜索完成的对象,包括不存在任何引用外部指针的对象以及从根对象可达的对象。

标记过程从根对象开始,将所有对象初始化为白色。然后,从根对象出发,逐步把所有可达的对象变成灰色,再逐步将灰色对象及其可达对象标记为黑色。最终,所有的白色对象都是不可达对象,即垃圾对象。

三、并发垃圾回收

Go语言的垃圾回收是并发的,意味着它能够在程序运行时自动进行垃圾回收,不会暂停整个程序。这种设计减少了"停顿"时间,使其对性能的影响更小。

  1. 并发标记:在标记阶段,GC与用户程序并发执行,以减少程序性能的影响。
  2. 写屏障:为了确保并发标记的正确性,Go语言使用了写屏障技术。写屏障是一种在用户程序读取对象、创建新对象以及更新对象指针时执行的一段代码。它用于确保在并发标记过程中,黑色对象不会直接指向白色对象,从而维护三色不变性。

四、垃圾回收过程

Go语言的垃圾收集可以分成清除终止、标记、标记终止和清除四个不同阶段:

  1. 清理终止阶段:暂停程序,所有的处理器在这时会进入安全点。如果当前垃圾收集循环是强制触发的,还需要处理还未清理的内存管理单元。
  2. 标记阶段:将状态切换至_GCmark、开启写屏障、用户程序协助(Mutator Assists)并将根对象入队;恢复执行程序,标记进程和用于协助的用户程序会开始并发标记内存中的对象。
  3. 标记终止阶段:暂停程序、将状态切换至_GCmarktermination并关闭辅助标记的用户程序;清理处理器上的线程缓存。
  4. 清理阶段:将状态切换至_GCoff开始清理阶段、初始化清理状态并关闭写屏障。

五、触发垃圾回收的条件

  1. 内存使用量:当内存使用量超过一定的阈值时,垃圾回收会被触发。Go使用环境变量GOGC来调整垃圾收集的目标百分比,默认值为100,即当已分配的内存大小与垃圾回收前的内存使用量的比例达到100%时,会触发GC。
  2. 分配新对象:在分配新的对象时,Go会检查当前的内存使用情况,并可能触发垃圾回收,以确保有足够的内存空间。
  3. 手动触发:开发者可以使用runtime.GC()函数在代码中手动触发垃圾回收。

综上所述,Go语言的垃圾回收机制通过标记-清除算法和三色标记法来识别并回收不再使用的内存空间。同时,通过并发垃圾回收和写屏障技术来优化性能并确保正确性。

相关推荐
寻星探路2 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
不老刘2 小时前
LiveKit 本地部署全流程指南(含 HTTPS/WSS)
golang·实时音视频·livekit
曹牧4 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法5 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7255 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎5 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄5 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿5 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
wgslucky5 小时前
jdk17 配置jvm参数中gc的日志及控制日志数量和大小
jvm·gc·-xlog
小韩学长yyds6 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化