1.Page
Golang的Page,在操作系统对虚拟内存管理的MMU定义的物理页有相似的定义,默认的Page为8KB
2.mSpan
多个连续的Page称之为是一个Span,其定义含义有操作系统的管理的页表相似
3.Size Class
Size Class: 相当于 一个等级和刻度, 比如 第二等级 就代表 一个Page页 8B~16Byte
Object Size: 相当于一个Page的大小,Golang内存管理模块针对内存管理更加细化的内存管理单元
Span Class: 是否需要 GC扫描(Golang的内存回收机制)
4.MCache
那么把上面三个合并在一起就是MCache了, 在每个协程调度器下都有一个MCache
对于Span Class为0和1的,也就是对应Size Class为0的规格刻度内存,mcache实际上是没有分配任何内存的。因为Golang内存管理对内存为0的数据申请做了特殊处理,如果申请的数据大小为0将直接返回一个固定内存地址,不会走Golang内存管理的正常逻辑
这就是为什么 使用空结构体能节省内存的原因
//第一篇/chapter3/MyGolang/zeroBase.go
package main
import (
"fmt"
)
func main() {
var (
//0内存对象
a struct{}
b [0]int
//100个0内存struct{}
c [100]struct{}
//100个0内存struct{},make申请形式
d = make([]struct{}, 100)
)
fmt.Printf("%p\n", &a)
fmt.Printf("%p\n", &b)
fmt.Printf("%p\n", &c[50]) //取任意元素
fmt.Printf("%p\n", &(d[50])) //取任意元素
}
5.MCentral与MHeap
注意: MCentral 的访问 和 MHeap的访问 需要加锁