Go的内存管理机制|青训营笔记

131 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记。

链接:高性能 Go 语言发行版优化与落地实践.pptx - 飞书文档 (feishu.cn)

自动内存管理

Go语言中存在自动的内存管理,可以分为以下几个模块:

1、Mutator:业务线程,能够分配新对象并修改对象指向关系

2、Collector:GC线程,能够找到存活对象并且回收死亡对象的内存空间

GC线程分为以下几种:

1、Serial GC:只有一个collecor

L15_MZ0EX}3BV9R9VKRU`TU.png

2、Parallel GC:支持多个collector同时回收的GC

}882M09B_%%THAFF}NX0FA0.png

3、Concurrent GC:mutator(s)和collector(s)可以同时执行

(P_2GV163$R)5P309R~0P7Y.png

GO垃圾回收

1、追踪垃圾回收

标记根对象:静态变量、全局变量、常量、线程栈等

标记:找到可达对象

清理:所有不可达对象

根据对象的生命周期,使用不同的标记和清理策略:

Copying GC(将对象复制到另外的内存空间)、Mark-sweep GC(使用free list管理空闲内存)、Mark-compact GC(原地整理对象)

2、分代GC

Young generation:常规的对象分配,由于存活对象很少,可以采用copying collection

Old generation:对象趋向于一直活着,反复复制开销较大,可以采用mark-sweep collection

3、引用计数

对象存活条件:当且仅当引用计数大于0

缺点:维护引用技术的开销较大,需要使用原子操作;无法回收环形数据结构——weak reference;每个对象都引入了额外的内存空间存储引用数目;回收内存时依然可能引发暂停。

GO内存分配

TCMalloc:thread caching

08}E4AV7)9NR{K`7ZU26(0H.png

每个p包含一个mcache用于快速分配内存,为绑定在p上的g分配对象;

mcache管理一组mspan,当mchache中的mspan分配完毕时,向mcentral申请带有未分配块的mspan;

当mspan中没有分配的对象,mspan会被缓存在mcentral中,而不是立刻释放并归还给OS。