关于内存分配的多级缓存的问题

来源: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回答

Xargin

2021-08-05

1.1.11版本以前的线性内存和1.11以后的稀疏内存,是不是只是页堆的存储方式不同,多级缓存机制不受这个变化影响?

A:对,就是全局的内存管理有差别,多级缓存变化不大。


2.当我们有一个微对象tiny需要申请内存的时候,这个流程对不对:①mcache中的tiny微分配器如果有合适的空间就直接分配到这里②如果没有就按照相应的spanclass从mcache的alloc中获取相应的mspan③如果没有获取到,就同样按照spanclass找到相应的mcentral,在这个mcentral的空闲集合中找到一个mspan④如果还没有mspan可以用,就需要走扩容,去mheap里面拿过来。

A:你这个描述问题不大。

差不多是这么个流程: https://www.figma.com/proto/tSl3CoSWKitJtvIhqLd8Ek/memory-management-%26%26-garbage-collection?page-id=165%3A81&node-id=165%3A197&viewport=-20163%2C1534%2C2.7550384998321533&scaling=scale-down


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 代码

0
hinxiaoyi
hp>👍💯好的 曹大 帅

h021-08-05
共1条回复

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程