这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
今天主要学习了高性能 Go 语言发行版优化的内存管理优化,以及自动内存管理与 Go 内存管理知识,学习了一些可行性的优化方案。除此之外,也学习了的 Go 内存分配和编译器相关知识,了解了 Go 内存管理过程中问题,以及相关解决方案,同时学习了一些编译器的基本算法和编译器优化路径。
go语言的内存管理是建立在操作系统的内存管理之上的,它最大化程度上的发挥了操作系统内存管理层面的优势,避开了导致低效的情况。go实现了主动申请与主动释放管理,增加了逃逸分析和GC(垃圾回收),将开发者从内存管理中释放出来,让开发者有更多的精力去关注软件设计,而不是底层的内存问题。这是Go语言成为高生产力语言的原因之一。
我们可以将go语言的内存管理看成一个两级的内存管理结构,MHeap和MCache。上一级管理的基本单位是页,主要用于分配大对象,每次分配都是若干连续的页,也就是若干个4KB的大小。使用的数据结构是MHeap和MSpan,用BestFit算法做分配,用位示图做回收。下面一级管理的基本单位是不同类型的固定大小的对象,更像一个对象池而不是内存池,用引用计数做回收。下面这一级使用的数据结构是MCache。Go的内存分配器在分配对象时,根据对象的大小,分成三类:小对象(小于等于16B)、一般对象(大于16B,小于等于32KB)、大对象(大于32KB)。MCache层次仅用于分配小对象,分配和释放大的对象则是直接使用MHeap的,跳过MCache和MCentral自由链。