GC

译:The Green Tea Garbage Collector

原文链接:The Green Tea Garbage Collector

Go 1.25 引入了一款名为 Green Tea 的新型实验性垃圾回收器,在构建时通过设置 GOEXPERIMENT=greenteagc 来启用。

许多工作负载在垃圾回收上花费的时间减少了约 10%,但有些工作负载的降幅高达 40%!它已经为生产环境做好了准备,并且已经在 Google 内部使用,我们鼓励您尝试一下。我们知道有些工作负载受益不多,甚至根本没有受益,因此您的反馈对于我们未来的工作至关重要。

根据我们现在掌握的数据,我们计划在 Go 1.26 中将其作为默认设置。要报告任何问题,请提交一个新 issue。要报告任何成功案例,请回复现有的 Green Tea issue

本文是根据 Michael KnyszekGopherCon 2025 上的演讲整理而成的博客文章。一旦演讲视频在线发布,我们将更新这篇博文并附上链接。

理解垃圾回收 #

在我们讨论 Green Tea 之前,让我们先就垃圾回收达成共识。

对象和指针 #

垃圾回收的目的是自动回收和重用程序不再使用的内存。为此,Go 垃圾回收器关注的是 对象指针

在 Go 运行时的上下文中,对象是其底层内存在堆上分配的 Go 值。当 Go 编译器无法确定值的生命周期时,就会在堆上分配内存。例如,以下代码片段分配了一个堆对象:一个指针切片的底层存储空间。

var x = make([]*int, 10) // 全局变量

Go 编译器无法将切片底层存储分配在堆以外的任何地方,因为它很难知道(甚至不可能知道) x 会引用该对象多长时间。

指针只是指示 Go 值在内存中位置的数字,Go 程序就是通过指针来引用对象的。例如,要获取上一个代码片段中分配的对象的起始地址的指针,我们可以这样写:

&x[0] // 0xc000104000

标记清除 #

Go 的垃圾回收器遵循一种广义上称为追踪式垃圾回收的策略,这意味着垃圾回收器会跟随或“追踪”程序中的指针,以确定程序仍在使用的对象。

...

访问量 访客数