知识卡片
Span管理同类块
内容
(书中 Go 1.14)Go 把内存分成 67 个级别的 span,级别按内部元素(对象槽)大小分类,同规格对象集中放在同批 span 中,用 allocCache 位图标记每个槽是否已分配。集中管理让分配只需在位图找空位、GC 标记清扫可批量操作,代价是对象被”对齐”到所属级别,产生一定浪费。
参考来源
- 位置:《Go语言底层原理剖析》第18章《内存分配管理》18.1.1节《span与元素》与18.2.2节《mcache缓存位图》
- 结论依据:原文明确"Go语言将内存分成了大大小小67个级别的span……span的级别不是以每个span的大小为依据的,而是以span中元素的大小为依据的",并举例"分配17字节的对象,会对应分配到比17字节大并最接近它的元素级别,即第3级,这导致最终分配了32字节";位图部分说明"mspan中拥有allocCache字段,其作为一个位图,用于标记span中的元素是否被分配",因此可以推出"span 按对象规格分级、用位图记录分配状态"的结论。
- 原始内容:Go语言将内存分成了大大小小67个级别的span,其中,0级代表特殊的大对象,其大小是不固定的。当具体的对象需要分配内存时,并不是直接分配span,而是分配不同级别的span中的元素……每个具体的对象在分配时都需要对齐到指定的大小,例如分配17字节的对象,会对应分配到比17字节大并最接近它的元素级别,即第3级,这导致最终分配了32字节……mspan中拥有allocCache字段,其作为一个位图,用于标记span中的元素是否被分配。