美文网首页
go 内存模型简要说明

go 内存模型简要说明

作者: overflow_e4e4 | 来源:发表于2022-12-21 11:40 被阅读0次

go 内存模型

image.png

大体上来说go的内存是先申请一大片内存,然后将内存分为各个小的span来管理,因为每个go对象有对应的对象大小,将会根据对象的大小放入不同span中。
细分来看go内存分配器包含内存管理单元、线程缓存、中心缓存和页堆几个重要组件, 分别对应的数据结构 mspan、 mcache、 mcentral、 mheap

mspan:

Go语言内存管理的基本单元,该结构体包含next和prev两个字段,分别指向了前一个和后一个的mspan;
串联后形成一个双向链表,mspanlist存储双向链表的头节点和尾节点并再mcache和mcentral中使用

mcache:

Go语言中的线程缓存,它会与线程上的处理器(GMP-P)绑定;

mcentral:

内存分配器的中心缓存,与线程缓存不同,访问中心缓存中的mspan需要使用互斥锁,每个mcentral都会管理某个spanclass的内存管理单元; 他会持有两个runtime.spanSet,分别存储包含空闲对象和不包含空闲对象的mspan。

mheap:

负责内存分配的核心组件,包含mcentral和heapArena,堆上所有mspan都是mheap结构分配来的
三个核心变量:
allspans: 已经分配的所有mspan
arenas: heapArena数组,用于管理一个个内存块
central: mcentral数组,用于管理对应spanClass的mspan
功能:

  1. 管理大对象
  2. 负责管理mcentral和heapAreana
  3. heapAreana负责管理空闲内存和向操作系统再申请内存。

总结:

  1. 大对象直接从mheap上分配;
  2. 小对象首先计算对象的规格大小,然后使用mcache中相应规格大小的mspan分配;
  3. 如果mcache没有相应规格大小的mspan,指向mcentral申请;
  4. 如果mcentral没有相应规格大小的mspan,指向mheap申请;
  5. 如果mheap没有相应规格大小的mspan,指向操作系统申请;

参考:
https://www.cntofu.com/book/3/zh/06.1.md
https://blog.csdn.net/weixin_46253576/article/details/124599571
https://cloud.tencent.com/developer/article/1476679?from=article.detail.1476473

相关文章

  • go 内存模型简要说明

    go 内存模型 大体上来说go的内存是先申请一大片内存,然后将内存分为各个小的span来管理,因为每个go对象有对...

  • Java 多线程基础

    JMM(Java内存模型) Java内存模型是一种逻辑模型,是一组预定规范,定义了每个变量的访问方式,简要运行方式...

  • Go——内存模型

    什么是内存模型 The Go memory model specifies the conditions unde...

  • go的内存模型

    Go内存模型 介绍 Go的内存模型指定了一个条件,在该条件下,可以保证在一个goroutine中读取便利,以观察通...

  • Go的内存模型

    介绍 如何保证在一个goroutine中看到在另一个goroutine修改的变量的值,这篇文章进行了详细说明。 建...

  • Go 的内存模型

    介绍 Go 的内存模型是可以让多个 goroutine 共享数据的,但指定了条件,在这种条件下,保证一个 goro...

  • Go 内存模型(The Go Memory Model)

    原文链接:https://golang.org/ref/mem,2014.05.31日的版本。自翻,仅供参考。 I...

  • Java内存模型学习简要总结

    Java内存模型主要分为工作内存和主内存,变量主要存储在主内存中,每一个线程都有自己的工作内存,对对主内存中的变...

  • go-map源码简单分析(map遍历为什么时随机的)

    GO 中map的底层是如何实现的 首先Go 语言采用的是哈希查找表,并且使用链表解决哈希冲突。 GO的内存模型 先...

  • Go并发编程元语以及在Tendermint/CosmosSDK中

    本文首先对并发编程模型和元语进行简要介绍,然后结合Tendermint/Cosmos-SDK源代码详细介绍Go语言...

网友评论

      本文标题:go 内存模型简要说明

      本文链接:https://www.haomeiwen.com/subject/hzguqdtx.html