知识卡片
对象分级分配
内容
(书中 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进行分配。