Content #
当 mcache 中的内存不够需要扩容时,需要向 mcentral 请求,mcentral 对应于 TCMalloc 中的 Central cache 结构。mcentral 的主要结构如下:
type mcentral struct {
spanclass spanClass
partial [2]spanSet // list of spans with a free object
full [2]spanSet // list of spans with no free objects
}
mcentral 中也存有 spanClass 的 ID 标识符,这表示说每个 mcentral 维护着固定一种 spanClass 的 mspan。 spanClass 下面是两个 spanSet,它们是 mcentral 维护的 mspan 集合。 partial 里存放的是包含着空闲空间的 mspan 集合,full 里存放的是不包含空闲空间的 span 集合。这里每种集合都存放两个元素,用来区分集合中 mspan 是否被清理过。
mcentral 不同于 mcache,每次请求 mcentral 中的 mspan 时,都可能发生不同线程直接的竞争。因此,在使用 mcentral 时需要进行加锁访问,具体来讲,就是 spanSet 的结构中会有一个 mutex 的锁的字段。
Viewpoint #
From #
24 | GC实例:Python和Go的内存管理机制是怎样的?