Go内存管理

作者: haisongzhang | 来源:发表于2020-04-09 00:39 被阅读0次

最进公司组织内部分享,我准备了Go语言的内存管理。查了很多资料整理出一幅图,并对知识点做一个整理。

内存空间主要包含两个区域 — 栈区(Stack)和堆区(Heap)。函数调用的参数、返回值以及局部变量都会被分配到栈上(内存逃逸会被分配到堆上),这部分内存会由编译器进行管理;不同编程语言使用不同的方法管理堆区的内存,C++ 等编程语言会由程序员主动new和delete内存,Go 语言会由程序员和编译器共同管理,堆中的对象由内存分配器分配并由垃圾收集器回收。

go-memory-layout

内存管理组件

Go 语言的内存分配器包含内存管理单元(mspan)、线程缓存(mcache)、中心缓存(mcentral)和页堆(mheap)几个重要组件。

所有的 Go 语言程序都会在启动时初始化如上图所示的内存布局,每一个处理器都会被分配一个线程缓存 mcache 用于处理微对象和小对象的分配,它们会持有内存管理单元 mspan。

每个类型的内存管理单元都会管理特定大小的对象,当内存管理单元中不存在空闲对象时,它们会从 mheap 持有的 134 个中心缓存 mcentral 中获取新的内存单元,中心缓存属于全局的堆结构体 mheap,它会从操作系统中申请内存。

内存管理单元

mspan 是 Go 语言内存管理的基本单元,该结构体中包含 next 和 prev 两个字段,它们分别指向了前一个和后一个 mspan

type mspan struct {
    next *mspan
    prev *mspan
    ...
}

串联后的上述结构体会构成如下双向链表,运行时会使用mSpanList 存储双向链表的头结点和尾节点并在线程缓存以及中心缓存中使用。

线程缓存

mcache 是 Go 语言中的线程缓存,它会与线程上的处理器一一绑定,主要用来缓存用户程序申请的微小对象。每一个线程缓存都持有 67 * 2 个 mspan,这些内存管理单元都存储在结构体的 alloc 字段中。

中心缓存

mcentral 是内存分配器的中心缓存,与线程缓存不同,访问中心缓存中的内存管理单元需要使用互斥锁:

type mcentral struct {
    lock      mutex
    spanclass spanClass
    nonempty  mSpanList
    empty     mSpanList
    nmalloc uint64
}

每一个中心缓存都会管理某一类的内存管理单元,它会同时持有两个 mSpanList,分别存储包含空闲对象的列表和不包含空闲对象的链表

页堆

mheap 是内存分配的核心结构体,Go 语言程序只会存在一个全局的结构,而堆上初始化的所有对象都由该结构体统一管理,该结构体中包含两组非常重要的字段,其中一个是全局的中心缓存列表 central,另一个是管理堆区内存区域的 arenas 以及相关字段。

页堆中包含一个长度为 134 的 mcentral 数组,其中 67 个为跨度类需要 scan 的中心缓存,另外的 67 个是 noscan 的中心缓存

小结:

Go 语言的内存分配器实现非常复杂,但从整体来看类似于一个三级缓存,每一级都包含一个数组存这不同大小块内存链表的头指针。每次分配内存是先从最低级找,没有就去上一级取一块。

相关文章

  • Go语言——内存管理

    Go语言——内存管理 参考: 图解 TCMalloc Golang 内存管理 Go 内存管理 问题 内存碎片:避免...

  • 图解 Go 内存管理器的内存分配策略

    关于Go的内存分配 在 Go 语言里,从内存的分配到不再使用后内存的回收等等这些内存管理工作都是由 Go 在底层完...

  • go 内存模型简要说明

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

  • Go 语言内存管理(二):Go 内存管理

    介绍 了解操作系统对内存的管理机制后,现在可以去看下 Go 语言是如何利用底层的这些特性来优化内存的。Go 的内存...

  • Go 语言内存管理(一):系统内存管理

    介绍 要搞明白 Go 语言的内存管理,就必须先理解操作系统以及机器硬件是如何管理内存的。因为 Go 语言的内部机制...

  • go内存管理

    1. Go 内存的划分 强烈推荐参考链接 在讲Go的堆栈之前,先温习一下堆栈基础知识。 什么是堆栈?在计算机中堆栈...

  • go 内存管理

    1. 内存分配步骤 go 给对象分配内存的主要流程: object size > 32K,则使用 mheap 直接...

  • go内存管理

    这篇文章可以看作是内存管理这篇长文的学习总结吧,原文基于源码剖析了整个go的内存管理,非常详尽。 程序中的数据和变...

  • Go内存管理

    https://www.cnblogs.com/shijingxiang/articles/11466957.ht...

  • Go内存管理

    最进公司组织内部分享,我准备了Go语言的内存管理。查了很多资料整理出一幅图,并对知识点做一个整理。 内存空间主要包...

网友评论

    本文标题:Go内存管理

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