golang内存分配机制
Go 语言的内存分配机制是其高性能的关键之一,它借鉴了 TCMalloc 的思想,设计了一套高效、低碎片、低锁竞争的分配系统。这套机制的核心可以概括为:分级分配和三级缓存。
🎯 核心目标与全景图
Go 内存分配器的设计目标是快、低碎片和低锁竞争。它通过以下方式实现:
- 对象分级:根据对象大小采用不同的分配策略,避免大小对象混放导致的内存碎片。
- 三级缓存:采用
mcache->mcentral->mheap的层级结构,大部分小对象分配可以在无锁的本地缓存中完成。
当你在代码中创建一个变量时,Go 运行时(runtime)会通过 mallocgc 函数来决定如何为其分配内存。
📦 对象分级:大小决定策略
Go 根据对象的大小,将其分为三类,并采用不同的分配路径:
| 类型 | 大小范围 | 分配方式 |
|---|---|---|
| 微小对象 (Tiny) | ≤ 16 字节 | 从 mcache 的专属 tiny 分配器中分配,多个微小对象会被打包到同一个内存块中,以最大化利用率。 |
| 小对象 (Small) | 16 字节 ~ 32KB | 这是最常见的分配类型。对象会被归入 67 个预定义的规格(size class)之一,然后从对应的 mspan 中分配。 |
| 大对象 (Large) | > 32KB | 直接从 mheap 分配,不经过 mcache 和 mcentral,以避免占用宝贵的缓存资源。 |
🗂️ 三级缓存架构:高效的内存流水线
这是 Go 内存分配机制的核心,它像一条高效的流水线,将内存从操作系统逐级传递到 Goroutine。
1. mcache (Per-P 缓存)
- 角色:每个逻辑处理器
P都拥有一个私有的mcache。 - 特点:无锁。因为
P在同一时间只会被一个操作系统线程M执行,所以对mcache的访问是线程安全的,无需加锁。 - 功能:它包含一系列
mspan,每个mspan对应一种size class。90% 以上的小对象分配都在这里完成,速度极快。
2. mcentral (全局中心)
- 角色:一个全局共享的内存中心,按
size class组织。 - 特点:有锁。当某个
P的mcache中某种规格的mspan耗尽时,会向mcentral申请。 - 功能:它为
mcache批量补充指定规格的mspan。如果mcentral自身也没有空闲的mspan,它会向mheap申请。
3. mheap (堆管理器)
- 角色:管理整个 Go 程序的堆内存(默认最大 512GB)。
- 功能:
- 负责通过系统调用(如
mmap)向操作系统申请大块内存(称为arena)。 - 管理所有
mspan的元数据。 - 处理大对象的直接分配请求。
- 负责通过系统调用(如
📐 mspan:内存管理的基本单元
mspan 是贯穿整个分配体系的核心数据结构。它代表了一组连续的物理内存页(page,通常是 8KB)。
- 每个
mspan只服务于一种size class。例如,一个 8KB 的页,如果用于分配 24 字节的对象,它会被划分为8192 / 24 ≈ 341个等长的槽(slot)。 mspan在mcache、mcentral和mheap之间流转,实现了内存的高效复用,减少了与操作系统交互的频率。
🚀 一次完整的内存分配流程
以一个 24 字节的小对象分配为例,整个流程如下:
- 逃逸分析:编译器首先判断对象是否“逃逸”出当前函数作用域。
- 未逃逸:直接分配在栈(Stack)上。函数返回时,栈帧自动弹出,内存立即回收,零 GC 压力。
- 已逃逸:需要在堆(Heap)上分配,进入下一步。
- 查找 mcache:根据对象大小(24B)确定
size class,然后从当前P的mcache中找到对应的mspan。 - 快速分配:如果
mspan中有空闲的槽(slot),直接取出一个返回。整个过程无锁,非常高效。 - 向 mcentral 申请:如果
mcache中的mspan已耗尽,mcache会向mcentral发起请求,申请一个新的mspan。 - 向 mheap 申请:如果
mcentral也没有空闲的mspan,它会向mheap申请。mheap可能会向操作系统申请新的内存页,并将其组织成mspan后下发。
如果是大对象(>32KB),则会跳过 mcache 和 mcentral,直接向 mheap 申请一块足够大的连续内存。
🤝 与 GC 的协同
内存分配器与垃圾回收器(GC)紧密协作。在分配对象时,会标记该对象是否包含指针(scan 或 noscan)。
scan对象:包含指针,GC 在标记阶段需要扫描它,以追踪其引用的其他对象。noscan对象:不包含指针(如string、[]byte),GC 会直接跳过扫描,这大大减少了 GC 的工作量,提升了回收效率。

浙公网安备 33010602011771号