go内存分配

[TOC]

主要结构

注意page 页是向操作系统申请内存的最小单位

Go内存管理结构总览

heapArena

保留整个虚拟地址空间

mheap

分配的堆,在页大小为8KB的粒度上进行管理。位于黑色区域,访问需要全局加锁。

mspan

是mheap上管理的一连串的页。

mcentral

收集了给定大小等级的所有span。位于灰色区域,访问需要局部加锁。

mcache

为pre-p的缓存。位于白色区域,访问不需要加锁。

对象分配

大对象分配

大对象(32KB, +∞) 如果要分配的页数小于16时,就先尝试从pcache中申请内存。如果申请失败或者申请的页数过大则通过mheap上分配内存。

小对象分配

小对象[16B, 32KB] 先尝试从mcache中获取,再尝试从mcentral中获取,最后尝试从mheap中获取

微对象分配

微对象(0B, 16B) 先尝试从mcache中获取tinySpanClass ,再尝试从mcentral中获取,最后尝试从mheap中获取

分配器

fixalloc

fixalloc 是一个基于自由列表的固定大小的分配器。TODO: 7.2 组件

tiny分配器

stackcache

reference

Go内存管理三部曲[1]- 内存分配

内存分配

Go内存分配那些事,就这么简单!

7.2 组件

7.1 内存分配器

详解Go中内存分配源码实现

最后更新于

这有帮助吗?