golang central从heap获取span详解

简介

当向central申请内存,而central中span队列又已满时,就会向heap申请内存

结构体

先大概看看heap的结构

type mheap struct {
	// 以下为sweep相关的变量
	lock      mutex
	pages     pageAlloc // page allocation data structure
	sweepgen  uint32    // sweep generation, see comment in mspan; written during STW
	sweepdone uint32    // all spans are swept
	sweepers  uint32    // number of active sweepone calls

	// 所有创建过的spans
	allspans []*mspan // all spans out there

	// 所有映射过的arena的index,可以用来找到对应的空间
	allArenas []arenaIdx
	// allArenas的快照,在sweep循环开始时创建,可以被GC安全地访问
	sweepArenas []arenaIdx
	// 每次清理都会额外清理一些pages,这些(包括释放的)会放在这个pool中
	reclaimCredit uintptr
	...
}

申请过程

一.根据所需span的npages和size,heap申请内存:
  1. 锁住当前g,防止GC捣乱
  2. 为了防止内存无限增长,申请之前先清理&申明至少npage张页。
  3. 从credit pool中拿出npage页,如果不够则申请一大块工作区(512),还不够就循环取。如果申请的多了,就将多余的放入credit pool中
二.获取span
  1. 尝试从mspancache缓存中获取span,没有则从pages申请npage的内存,再没有就尝试增加npages内存,还没就内存不足报错了
  2. 如果需要的物理内存,则申请后free掉pages附近多的内存
  3. 有了span后,就对其进行初始化
三.central再完成初始化
  1. 计算span的end地址等
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值