

深入理解 Go | 内存管理:内存分配
source link: https://ictar.github.io/2020/04/20/dive-into-go-memory-alloc/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

深入理解 Go | 内存管理:内存分配
基于 Go 1.14
Golang 的内存分配器借鉴了 TCMalloc,在多级缓存的基础上,根据对象大小所属类别,实施不同分配策略。
- 内存管理单元
runtime.mspan
:Go 语言内存管理的基本单元,管理多个页- 页大小:8KB
- 线程缓存
runtime.mcache
:与线程上的处理器一一绑定,无需锁 - 中心缓存
runtime.mcentral
:需要锁 - 页堆
runtime.mheap
:一个 Go 语言程序只会存在一个全局的页堆
从线程缓存到操作系统内存,遵循一种模式: * 如果在当前内存管理组件获取不到可用内存,则会向下一级组件申请内存并进行扩容 * 如果最后到操作系统都申请不到内存的话,则说明宿主机上内存耗尽,程序会终止。
堆上所有的对象都会通过 runtime.newobject()
来分配内存。
根据申请对象的大小执行不同的策略: * 微对象 0 < size < 16B
:线程缓存中的微对象分配器 ——> 线程缓存 ——> 中心缓存 ——> 页堆 * 小对象 16B <= size <= 32KB
:线程缓存 ——> 中心缓存 ——> 页堆 * 大对象 size > 32KB
:直接在堆上进行分配
内存管理组件代码
Recommend
-
30
本文基于Go 1.13 Go程序的内存从申请阶段到不再使用后的释放阶段都由Go标准库自动管理。尽管管理工作不需要开发者参与,但是Go对内存...
-
44
原文: medium.com/a-journey-w… 这...
-
10
:information_source: 这篇文章基于 Go 1.13。 在内存从分配到回收的生命周期中,内存不再被使用的时候,标准库会自动执行...
-
5
-
12
By KSkun, 2021/11实习时接触了许多关于游戏开发相关的内存话题,在这里分享一些基于 Unity 游戏开发视角可能用得上的底层知识。这个系列将分成 4 期来探讨以下 4 个话题:内存分配与管理内存占用、泄露的排查方法PC、And...
-
5
深度理解glibc内存分配 ...
-
17
PHP内存管理ZMM(三)-内存分配函数emalloc 2018-04-11 emalloc是ZMM中heap层实现的函数,其内部调用_zend_mm_alloc_int函数。在_zend_mm_alloc_int中会依次在heap层的缓存区、小内存区、...
-
2
深入理解 Go | 内存管理:栈 发表于 2020-04-26...
-
4
深入理解 Go | 内存管理:垃圾收集(GC) 发表于 2020-04-25...
-
7
理解Linux内存管理:分配、释放和管理内存 作者:编程技术汇 2023-10-18 09:30:45 系统 Linux内存管理负责分配、释放和管理内存资源,采用虚...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK