golang 内存分配

本文介绍了Golang内存分配的基本策略,包括从操作系统申请大块内存、切分小块内存以及内存块的管理。内存块分为span和object,其中span用于内部管理,object面向对象分配。内存管理组件包括malloc.go、cache、central和heap。分配流程涉及从cache、central到heap的查找和分配。当无法从现有资源获取时,会向操作系统申请新的内存。此外,文章还提及了central分配span的详细过程。
摘要由CSDN通过智能技术生成

基本策略

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

tips:内存分配只管理内存块,并不关心对象状态。且它不会主动回收内存,垃圾回收器在完成清理操作后,触发内存分配器的回收操作。

内存块

管理的内存块分为两种

  • span:由多个地址连续的页(page)组成的大块内存(面向内部管理)
  • object: 将span按特定大小切分成多个小块,每个小块可以存储一个对象(面向对象分配)
  1. 页数区分不同大小的span,需要时按页数作为索引查找。没有合适的就取更大的进行裁剪,多余部分放回管理数组。并会将地址相邻的span合并,减少碎片
_PageShift      = 13
...
pageShift = _PageShift
_PageSize = 1 << _PageShift // 8kb
  1. 对于存储对象的object,按8字节倍数分为n种。如24字节的可以存储17-24字节的对象。初始化时,会构建存储大小和规格的对应关系,切分
_NumSizeClasses = 68
...
var class_to_size = [_NumSizeClasses]uint16{
   0, 8, 16...<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值