Golang内存管理
- 架构
三层架构 - mcache: 逻辑处理器(P)私有缓存,用于快速分配小对象。 - mcentral: 所有逻辑处理器(P)共享的中央缓存,为mcache提供内存。 - mheap: 程序全局堆,整个程序共享的一片虚拟地址空间。
- 内存分配
分配单位: - mspan: 真正存储对象的内存块。 内存分页: - 8kb每页 分配规则: - 大于32kb的对象,直接分配到mheap,即堆中。 - 小于32kb的对象,先尝试从mcache中寻找合适的mspan,没有则向上申请空间,从mcentral到mheap,直到可以拿到合适的mspan。 - 逃逸分析。编译阶段golang会做内存逃逸分析,超过32kb的对象会隐式逃逸(对应第一点),对象影响范围超出作用域(如函数返回对象指针)也会发生逃逸。逃逸分析可以预先确认对象是否需要分配到堆上,减少内存分配开销。 特殊规则: - chan类型总是分配在堆上,因为chan设计用于跨栈通信,影响范围通常都会超出作用域。
- 内存回收
三色标记清除法,详细介绍如下: https://www.cnblogs.com/CJTARRR/p/19059066
浙公网安备 33010602011771号