关于内存分配的多级缓存的问题
来源:1-13 Go 语言的内存管理与垃圾回收
linxiaoyi
2021-08-05 17:23:17
曹大,有几个问题想问一下
1.1.11版本以前的线性内存和1.11以后的稀疏内存,是不是只是页堆的存储方式不同,多级缓存机制不受这个变化影响?
2.当我们有一个微对象tiny需要申请内存的时候,这个流程对不对:①mcache中的tiny微分配器如果有合适的空间就直接分配到这里②如果没有就按照相应的spanclass从mcache的alloc中获取相应的mspan③如果没有获取到,就同样按照spanclass找到相应的mcentral,在这个mcentral的空闲集合中找到一个mspan④如果还没有mspan可以用,就需要走扩容,去mheap里面拿过来。
3.按照上面流程我们每次拿到的mspan结构体管理的pages是真的被拿到了各级缓存中,还是说 所有的pages一直都是在mheap的arenas管理的arena中,mspan里面真的包含了实际的虚拟内存页吗?
4.我们各级缓存中的mspan被GC后,释放出来之后是还在对应的缓存中,还是统一回到mheap中?
有点多,实在比较乱,感谢曹大!
1回答
1.1.11版本以前的线性内存和1.11以后的稀疏内存,是不是只是页堆的存储方式不同,多级缓存机制不受这个变化影响?
A:对,就是全局的内存管理有差别,多级缓存变化不大。
2.当我们有一个微对象tiny需要申请内存的时候,这个流程对不对:①mcache中的tiny微分配器如果有合适的空间就直接分配到这里②如果没有就按照相应的spanclass从mcache的alloc中获取相应的mspan③如果没有获取到,就同样按照spanclass找到相应的mcentral,在这个mcentral的空闲集合中找到一个mspan④如果还没有mspan可以用,就需要走扩容,去mheap里面拿过来。
A:你这个描述问题不大。
3.按照上面流程我们每次拿到的mspan结构体管理的pages是真的被拿到了各级缓存中,还是说 所有的pages一直都是在mheap的arenas管理的arena中,mspan里面真的包含了实际的虚拟内存页吗?
A:mspan,mcache,mcentral 这些其实是对内存分配过程的抽象,只是记录位置用的~页管理肯定还是全局的 mheap 负责的
4.我们各级缓存中的mspan被GC后,释放出来之后是还在对应的缓存中,还是统一回到mheap中?
sweep 过程分两种:
1) 后台的 bgsweep ---> 这个过程有可能会把内存放回到 mheap 的 mcentral
2) 分配内存时候的顺手 sweep ---> 这个过程中只是扫一些 slot 出来给分配过程使用,不会放回 mcentral
简单的说明可以看看这个 https://medium.com/a-journey-with-go/go-memory-management-and-memory-sweep-cc71b484de05,
代码的话需要看一下,bgsweep 和 alloc 过程中的 sweep 代码
相似问题