这是关于 Go 中一种基于区域的内存管理设计草案的讨论,主要内容如下:
- 背景:
arena experiment
向标准库添加了Arena
类型,实现了基于区域的内存管理,但因与语言和标准库结合不佳而被搁置。 - 目标:首要目标是降低与 GC 相关的资源成本;其次是可组合性,使 API 无需改变即可利用类似区域的内存分配模式,且区域能与标准库和现有优化组合;最后要易于使用和理解。
- 设计:核心是一对类似函数调用注释的函数
Do
和Ignore
。Do
创建区域范围,f
在其中分配的内存可被隐式绑定到区域,函数返回时自动回收未绑定的内存;Ignore
使函数及其调用者忽略当前区域。与arena
相比,区域更像是隐式的协程局部arena
。 - 收益和成本总结:核心收益是降低 GC 开销,还有可能更高效地分配内存;但需要一些“魔法”(协程局部写屏障)来动态将内存从区域转移到堆,提升内存的成本较高。
- 设计讨论:关于协程局部区域状态的问题,若大部分内存遵循区域规则则可实现明显优势,且区域错误使用不会导致程序崩溃;关于
region.Ignore
,虽可能引发对代码控制的担忧,但在标准库中某些情况下不应使用。 - 可能的扩展:通过 PGO 自动禁用昂贵的区域,提供
GOEXPERIMENT
使每个协程隐式成为区域,提供GODEBUG
来禁用所有区域。 - 下一步:该设计尚未有原型,需评估社区兴趣,若有兴趣则构建原型并用于引导设计,可能会移除标准库中的
arena
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。