知识卡片

对象分级分配

普通读书笔记卡 · 1485

内容

(书中 Go 1.14,TCMalloc 思想)Go 按大小把对象分为微小(字节)、小()、大(≥32KB)对象,走不同分配路径:微小和小对象经 mcache→mcentral→mheap 逐级查找,大对象直接由 mheap 分配。分级让高频小对象尽量停在无锁本地缓存,本地不足才升级到全局结构,分配路径属于该版本实现细节。

参考来源

- 位置:《Go语言底层原理剖析》第18章《内存分配管理》18.2节《对象分配》 - 结论依据:原文明确"内存分配时,将对象按照大小不同划分为微小(tiny)对象、小对象、大对象",并在后续小节分别说明微小对象(<16字节)"会被放入class为2的span中"、小对象(<32KB)"和微小对象的分配一样,小对象分配经历mcache→mcentral→mheap位图查找→mheap基数树查找→操作系统分配的过程"、大对象(≥32KB)"内存分配时不与mcache和mcentral沟通,直接通过mheap进行分配",因此可以推出"Go 按对象大小分级、走不同分配路径"的结论。 - 原始内容:内存分配时,将对象按照大小不同划分为微小(tiny)对象、小对象、大对象……微小对象……和微小对象的分配一样,小对象分配经历mcache→mcentral→mheap位图查找→mheap基数树查找→操作系统分配的过程……大对象指大于32KB的对象,内存分配时不与mcache和mcentral沟通,直接通过mheap进行分配。