Go 内存管理 -- 内存分配 二

接上一篇,下面来看看内存分配的初始化分配等。

初始化

首先会申请一段连续的内存空间以供使用,大小(64位机器上)512M(spans_mapped)+16G(bitmap_mapped)+512G(arena)。 hmap初始化的源码在src/runtime/proc.go中,大家可以参照本文看一下。 mheap初始化

func (h *mheap) init(spansStart, spansBytes uintptr) 

1、初始化空间 2、mcentral初始化 3、spans初始化 mheap具体的初始化发生在mallocinit()函数中(被schedinit()调用):

func mallocinit()

1、检查系统/硬件信息 2、 计算预留空间大小 3、尝试预留地址 4、初始化mheap中的一部分变量 5、其他部分初始化,67个mcentral在这里初始化 mcentral 初始化 1、设置自己的级别 2、将两个mspanList初始化 mcache

func procresize(nprocs int32) *p

而mcache的初始化在func procresize(nprocs int32)中,procresize也在schedinit()中调用,顺序在mallocinit()之后,所以说也就是说mcentral先初始化,然后是mheap. allocmcache allocmcache初始化比较简单,直接看下源码吧:

func allocmcache() *mcache {
    lock(&mheap_.lock)
    c := (*mcache)(mheap_.cachealloc.alloc())
    unlock(&mheap_.lock)
    for i := 0; i < _NumSizeClasses; i++ {
        c.alloc[i] = &emptymspan
    }
    c.next_sample = nextSample()
    return c
}

这几个函数执行完,管理结构、mheap、67个mcentral及每个goroutine的mcache都初始化完毕。

内存分配

针对于不同大小的的对象,go的分配策略是不同的: (0, 16B) 且不包含指针的对象: Tiny分配 (0, 16B) 包含指针的对象:正常分配 [16B, 32KB] : 正常分配 (32KB, -) : 大对象分配 Tiny分配和大对象分配都属于内存管理的优化范畴,这里就仅看正常分配。 1、获取当前线程的私有缓存mcache 2、跟据size计算出适合的class的id 3、从mcache的alloc[class]数组中找到可用的span 4、如果mcache没有可用的span,则从mcentral申请一个新的span加入mcache中。 5、如果mcentral中也没有可用的span,则从mheap中申请一个新的span加入mcentral。(这里大家可以注意下mcache、mcentral、mheap的层级关系) 6、从该span中获取到空闲对象地址并返回。 go的内存分配非常复杂,中间还有很多GC的细节在里面,一言半语的也说不详细,大家可以对着简单的纲要直接看源码,注释也非常详细,一定要对照上一篇的图来理解go内存管理。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据文摘

机器学习实时预测公交延迟!谷歌地图附加功能上线全球

据统计,全世界有数亿人乘坐公交车进行日常通勤,世界上一半以上的交通都涉及公交,与地铁等出行方式不同,虽然公交运输公司有提供公交线路的发车时间表,但是公交车的运行...

11810
来自专栏大话swift

go 编译执行文件分发

今天咱们不说go的语法知识,为什么不说语法了呢?因为咱们做了这么就的go东西全是在编辑器中运行的,大家是不是很想知道怎么在编辑器之外去执行go程序呢?(win的...

15110
来自专栏solate 杂货铺

mac 上安装Protobuffer

Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序...

32330
来自专栏比原链

Bystack跨链技术源码解读

Bystack是由比原链团队提出的一主多侧链架构的BaaS平台。其将区块链应用分为三层架构:底层账本层,侧链扩展层,业务适配层。底层账本层为Layer1,即为目...

8930
来自专栏大话swift

go基础入门(六)

上篇文章我们简易学了struct今天我们来继续深入的理解一下struct,为了更好的学些struct我们今天首选要先了解一下interface。

9820
来自专栏solate 杂货铺

Golang常见的坑笔记

Format 的时候 时间必须是 2006-01-02 15:04:05 ,奇葩时间。

7620
来自专栏solate 杂货铺

go语言学习-位运算

Go语言的大多数位运算符与C语言都比较类似,除了取反在C语言中是~x,而在Go语言中 是^x

8320
来自专栏solate 杂货铺

go语言学习-类型转换

1.字符串到整形(string to int):ParseInt 返回的是 int64

14440
来自专栏FreeRonin

几个实用技巧,值得你学习!

有时候我们需要对图片进行排版,但是在Word中很难排版,那么我们可以利用表格来进行图片的布局。

12210
来自专栏solate 杂货铺

go 格式化输出

  fmt 包实现了格式化 I/O 函数,类似于 C 的 printf 和 scanf。格式“占位符”衍生自 C,但比 C 更简单。

43240

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励