这是我参与「第五届青训营」伴学笔记创作活动的第 3 天
前言
本篇主要记录GO语言性能优化,包括自动内存管理和编译器优化相关知识。
自动内存管理
自动内存管理也叫垃圾回收,是指由程序语言的运行时系统管理动态内存。
- 相关概念
Mutator: 业务线程,分配新对象,修改对象指向关系 。
Collector: GC线程,找到存活对象,回收死亡对象的内存空间。
- 追踪垃圾回收
标记根对象->找到可达对象并标记->清理所有不可达对象
- 分代GC
每个对象根据经历过GC的次数都有一个年龄,对年轻和老年的对象,制定不同的GC策略,降低整体内存管理的开销。不同年龄的对象处于heap的不同区域。
- 引用计数
每个对象有一个引用数目,当且仅当引用次数大于0时对象存活。这种方法的优点是内存管理的操作被平摊到程序执行中。缺点是维护引用计数的开销较大,无法回收环形数据结构。
Go内存分配
Go的内存分配器在分配对象时,根据对象的大小,分成三类:小对象(小于等于16B)、一般对象(大于16B,小于等于32KB)、大对象(大于32KB)。
大体上的分配流程:
32KB 的对象,直接从mheap上分配;
<=16B 的对象使用mcache的tiny分配器分配;
(16B,32KB] 的对象,首先计算对象的规格大小,然后使用mcache中相应规格大小的mspan分配;
如果mcache没有相应规格大小的mspan,则向mcentral申请
如果mcentral没有相应规格大小的mspan,则向mheap申请
如果mheap中也没有合适大小的mspan,则向操作系统申请
内存分配频率高,小对象占比高