cfanbo / cfanbo.github.io

1 stars 0 forks source link

Golang 内存组件之mspan、mcache、mcentral 和 mheap 数据结构 | 学习笔记 #218

Open cfanbo opened 12 months ago

cfanbo commented 12 months ago

https://blog.haohtml.com/archives/29385/

Golang中的内存组件关系如下图所示golang 内存分配组件 在学习golang 内存时,经常会涉及几个重要的数据结构,如果不熟悉它们的情况下,理解起来就显得格外的吃力,所以本篇主要对相关的几个内存组件做下数据结构的介绍。 在 Golang 中,mcache、mspan、mcentral 和 mheap 是内存管理的四大组件,mcache 管理线程在本地缓存的 mspan,而 mcentral 管理着全局的 mspan 为所有 mcache 提供所有线程。 根据分配对象的大小,内部会使用不同的内存分配机制,详细参考函数 mallocgo(),所于内存分配与回收,参考文件介绍 malloc.go <16KB 会使用微小对象内存分配器从 P 中的 mcache 分配,主要使用 mcache.tinyXXX 这类的字段 16-32KB 从 P 中的 mcache 中分配 >32KB 直接从 mheap 中分配 对于golang中的内存申请流程,大家应该都非常熟悉了,这里不再进行详细描述。Golang 内存组件关系 mcache 在GPM关系中,会在每个 P 下都有一个 mcache 字段,用来表示内存信息。 在 Go 1.2 版本以前调度器使用的是 GM 模型,将 mcache 放在了 M 里,但发现存在诸多问题,其中对于内存这一块存在着巨大的浪费。每个 M 都持有 mcache 和 stack alloc,但只有在 M 运行 Go 代码时才需要使用内存(每个 mcache 可以高达2mb),当 M 在处于 syscall 或 网络请求 的时候是不需要内存的,再加上 M 又是允许创建多个的,这就造成了内存的很大浪费。所以从go 1.