Go 语言的内存分配机制可以分为几个主要类别,每个类别都有其特定的行为和优化:
1. 栈(Stack)分配
- 局部变量:在函数内部定义的变量通常分配在栈上。
- 大小限制:栈的大小有限,适用于生命周期短、大小固定的小对象。
- 快速分配:栈分配和回收速度快,因为不需要进行内存分配器的协调。
2. 堆(Heap)分配
- 全局变量:程序全局变量和静态变量分配在堆上。
- 长生命周期对象:对象的生命周期超出了函数调用的局部作用域时,它们会被分配到堆上。
- 垃圾回收:堆上的内存由 Go 的垃圾回收器管理,周期性地回收不再使用的对象。
3. 内存分配器(Allocator)
- mcentral:Go 使用了一个高效的内存分配器,称为
mcentral
,用于管理小对象的分配。 - 对象分类:根据对象的大小,它们被分类并存储在不同的中央缓存中。
- 滑动窗口:内存分配器使用滑动窗口策略,允许垃圾回收器并发运行,减少应用程序的暂停时间。
4. 垃圾回收(Garbage Collection, GC)
- 标记-清除算法:Go 使用三色标记法