GO语言性能优化:| 青训营笔记

65 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 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,则向操作系统申请

内存分配频率高,小对象占比高

编译器的结构

微信图片_20230118125014.png