内存分配器
运行时的内存分配器使用类似TCMalloc 的分配策略将对象根据大小分类, 并设计多层级的组件提高内存分配器的性能.
分配方法:
- 线性分配器
- 空闲链表分配器
分级分配(线程缓存分配)
使用多级缓存将对象根据大小分类,并按照类别实施不同的分配策略
Go 语言的内存分配器会根据申请分配的内存大小选择不同的处理逻辑,运行时根据对象的大小将对象分成微对象、小对象和大对象三种
- 微对象: (0, 16B)
- 小对象: [16B, 32KB]
- 大对象: (32KB, +∞)
多级缓存
- 线程缓存
- 中心缓存
- 页堆(直接分配大对象)
虚拟内存布局
- 线性内存
- 稀疏内存(现在使用的, 运行时使用二维的 runtime.heapArena 数组管理所有的内存)
内存管理组件
- 内存管理组件
- Go 语言内存管理的基本单元 runtime.mspan, 串联后构成一个双向链表
- 在线程缓存和中心缓存中使用.
- 线程缓存
- 与线程中的P绑定, 持有 68 * 2 个 runtime.mspan
- 会向中心缓存获取内存管理单元
- 中心缓存
- runtime.mcentral, 访问其的内存管理单元需要使用互斥锁
- 会像堆中申请新内存
- 页堆(runtime.mheap)
- 全局变量, 二维矩阵
- 该结构体包含