当前位置: 首页 > news >正文

GO语言内存管理结构

文章目录

  • 1、内存分区
    • 1.1、栈(Stack)
    • 1.2、堆(Heap)
  • 2、堆内存管理结构
    • 2.1、内存分配器(MCache → MArena → MSpan → MHeap)
    • 2.2、大小分类(Size Class)
    • 2.3、分配流程
  • 3、垃圾回收(Go语言堆空间自动回收)
    • 4、性能优化点

1、内存分区

Go 的内存主要分为两部分:栈(Stack)、堆(Heap)。

1.1、栈(Stack)

由编译器自动分配/释放,存储函数调用时的局部变量、参数、返回值等。

每个 Goroutine 有独立的栈(初始大小 2KB,可动态扩容/缩容)。

分配速度快(无需 GC 参与),但空间有限。

1.2、堆(Heap)

动态分配的内存(如 new、make 或逃逸分析的变量)。

由垃圾回收器(GC)自动管理,开发者无需手动释放。

分配速度较慢,但空间更大。

2、堆内存管理结构

Go 的堆内存通过多级缓存和分区策略高效管理:

2.1、内存分配器(MCache → MArena → MSpan → MHeap)

MCache(Per-P 缓存):

1、每个逻辑处理器(P)绑定的本地缓存,存储小对象(≤32KB)的分配。

2、无锁分配,提高并发性能。

MSpan(内存块管理单元):
1、一组连续的内存页(8KB 的倍数),按大小分类(如 8B、16B、…、32KB)。
2、通过 mspan 结构体管理,记录分配状态。

MArena(堆区抽象):
1、将堆划分为多个 Arena(64位系统默认每个 64MB),用于大对象分配。

MHeap(全局堆):
1、管理所有 MSpan,负责向操作系统申请/释放内存(通过 mmap 或 brk)。2、包含空闲列表(free 和 busy 链表)。

2.2、大小分类(Size Class)

将对象按大小分为约 70 个等级(如 8B、16B、24B…)。

每个等级对应固定的 MSpan,减少内存碎片。

2.3、分配流程

小对象(≤32KB):

优先从当前 P 的 MCache 分配 → 不足时从 MHeap 获取新的 MSpan。

大对象(>32KB):

直接从 MHeap 分配,绕过 MCache。

3、垃圾回收(Go语言堆空间自动回收)

Go 使用 三色标记-清除算法(并发标记 + STW 清扫):

1、标记阶段:遍历可达对象(从根对象 Goroutine 栈、全局变量等出发)。

2、清除阶段:回收不可达对象的内存。

3、写屏障(Write Barrier):保证并发标记时数据一致性。

4、分代策略:Go 1.12+ 引入局部代际优化(但非传统分代 GC)。

4、性能优化点

1、减少堆分配:避免指针逃逸、复用对象(如 sync.Pool)。

2、控制 GC 频率:调节 GOGC 环境变量(默认 100%)。

3、监控工具:

runtime.ReadMemStats 获取内存统计。

pprof 分析内存泄漏。

相关文章:

  • Nginx的增强与可视化!OpenResty Manager - 现代化UI+高性能反向代理+安全防护
  • Flutter基础()
  • 【C/C++】无符号调试:GDB解栈实战指南
  • 学习和测试WebApi项目限制客户端ip访问接口(基于中间件)
  • 深度学习入门:从神经网络基础到前向传播全面解析
  • [洛谷刷题8]
  • Redis三种高可用模式的使用场景及特点的详细介绍
  • # KVstorageBaseRaft-cpp 项目 RPC 模块源码学习
  • JVM中的安全点是什么,作用又是什么?
  • 苍穹外卖-创建阿里云oss工具包
  • 缓存(4):常见缓存 概念、问题、现象 及 预防问题
  • 关于物联网的基础知识(一)
  • 串口通讯
  • 【东枫科技】使用LabVIEW进行NVIDIA CUDA GPU 开发
  • 数据库分库分表实战指南:从原理到落地
  • ARMV8 RK3399 u-boot TPL启动流程分析 --start.S
  • JVM-类加载子系统
  • 机器学习极简入门:从基础概念到行业应用
  • 锚定基础与拥抱融合:C 语言在编程教育与技术社区的破圈之路
  • 全模态具身智能:从 VLM 到 MLLM
  • 学者的“好运气”:读本尼迪克特·安德森《椰壳碗外的人生》
  • 中美日内瓦经贸会谈联合声明
  • 金科股份重整方案通过,正式进入重整计划执行环节
  • 快评|印巴为何停火?已达成“一场胜利,各自表述”的效果
  • 巴基斯坦外长:印巴停火
  • 习近平会见斯洛伐克总理菲佐