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

这篇博客探讨了Go语言中的内存分配策略,包括从操作系统申请内存、切分内存成小块、对象分配和回收。讲解了span和object的概念,并介绍了三级缓存——cache、mcentral和mheap的逻辑。内存回收时,Go不直接关注对象而是整块span,通过遍历和合并span来回收内存。此外,文章还涉及到了垃圾回收的其他细节和系统部分的回收策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

  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则是最后一道缓存,在这里发起回收和mmap申请。

这里写图片描述

然后雨痕给了图说明的内存分布以及初始化的过程。
还顺带普及了一下内联优化。某些简单的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值