02.1跟雨痕看go源码-内存分配(分配&回收)

内存分配和垃圾回收有关,这里我们可以先看一下内存分配。
垃圾回收比较复杂,后面讲。

一开始雨痕大大说了几个基本策略:

  1. 每次从操作系统申请一大块内存(比如1MB),以减少系统调用。
  2. 将申请到的大块内存按预定大小预先切分成小块,构成链表。
  3. 为对象分配内存时,只需从大小合适的链表中提取一个小块即可。
  4. 回收对象内存时,将该小块内存重新归还到原链表,以便复用。
  5. 如果闲置内存过多,则尝试归还部分内存给操作系统,降低内存开销。

里面提到了两个概念
span: 就是1提到的大块内存被切成小块的链表。
object: 就是上面说的小块。

span的结构

内存结构预分配图
这里span虽然是按照小块的规格进行了分级,但实际上采取了比较灵活的策略,可能会在必要条件下把较大规格span的链表的一部分借给较小规格的span,实际合并时也会尝试合并相邻的span。

����golang直接采用tcmalloc的成熟架构。
cache central heap
这里做了三级缓存。

cache是每个golang里面的P搞一个,提供一个无锁分配。

然后central根据sizeclass的大小,把所有中等的object分成若干等级,然后在这里做其中一级缓存,减少计算量。。

heap则是最后一道缓存

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值