这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记。
链接:高性能 Go 语言发行版优化与落地实践.pptx - 飞书文档 (feishu.cn)
自动内存管理
Go语言中存在自动的内存管理,可以分为以下几个模块:
1、Mutator:业务线程,能够分配新对象并修改对象指向关系
2、Collector:GC线程,能够找到存活对象并且回收死亡对象的内存空间
GC线程分为以下几种:
1、Serial GC:只有一个collecor
2、Parallel GC:支持多个collector同时回收的GC
3、Concurrent GC:mutator(s)和collector(s)可以同时执行
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
每个p包含一个mcache用于快速分配内存,为绑定在p上的g分配对象;
mcache管理一组mspan,当mchache中的mspan分配完毕时,向mcentral申请带有未分配块的mspan;
当mspan中没有分配的对象,mspan会被缓存在mcentral中,而不是立刻释放并归还给OS。