GO语言内存管理结构

news2025/5/15 15:31:11

文章目录

  • 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 分析内存泄漏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初学c语言14(指针6)

一.sizeof和strlen的对比 1.sizeof 操作符,计算变量所占空间大小 2.strlen 库函数,函数原型为: 求的是字符串的长度,统计的是“\0”之前的字符个数 二.指针和笔试题解析 补充:数组名的意义 1.sizeof(数组名) 这…

数字化转型-4A架构之技术架构

4A架构系列文章 数字化转型-4A架构(业务架构、应用架构、数据架构、技术架构) 数字化转型-4A架构之业务架构 数字化转型-4A架构之应用架构 数字化转型-4A架构之数据架构 数字化转型-4A架构之技术架构 一、 技术架构 Technology Architecture 1. 技…

kaggle薅羊毛

参考:https://pytorch-tutorial.readthedocs.io/en/latest/tutorial/chapter05_application/5_1_kaggle/#512-kaggle https://github.com/girls-in-ai/Girls-In-AI/blob/master/machine_learning_diary/data_analysis/kaggle_intro.md 1,code training…

TCP 三次握手建立连接详解

文章目录 一、三次握手流程1、第一次握手2、第二次握手3、第三次握手 二、引申问题1、报文丢失,会发生什么?1.1、第一次握手丢失1.2、第二次握手丢失1.3、第三次握手丢失 2、为什么 ISN(Initial Sequence Number,初始序列号) 不固定3、为什么…

高海拔和远距离的人员识别:面部、体型和步态的融合

大家读完就觉得有帮助记得关注和点赞!!! 摘要 我们解决了在无约束环境中进行全身人体识别的问题。这个问题出现在诸如IARPA高空和远距离生物识别与身份识别(BRIAR)计划等监视场景中,其中生物识别数据是在长…

自然语言处理入门级项目——文本分类

文章目录 前言1.数据预处理1.1数据集介绍1.2数据集抽取1.3划分数据集1.4数据清洗1.5数据保存 2.样本的向量化表征2.1词汇表2.2向量化2.3自定义数据集2.4备注 结语 前言 本篇博客主要介绍自然语言处理领域中一个项目案例——文本分类,具体而言就是判断评价属于积极还…

一发入魂:极简解决 SwiftUI 复杂视图未能正确刷新的问题(上)

概述 各位似秃非秃小码农们都知道,在 SwiftUI 中视图是状态的函数,这意味着状态的改变会导致界面被刷新。 但是,对于有些复杂布局的 SwiftUI 视图来说,它们的界面并不能直接映射到对应的状态上去。这就会造成一个问题&#xff1…

软件设计师-下午题-试题4(15分)

目录 1 回溯法 1.1 N皇后问题 1.1.1 非递归求解N皇后问题 1.1.2 递归求解N皇后问题 1.2 真题 2 分治法 2.1 真题 3 动态规划法 3.1 0-1背包问题 3.2 真题 1 回溯法 1.1 N皇后问题 上图Q4与Q2在同一列且与Q1在同一斜线,先回溯到上一个皇后改变Q3皇后的位置…

leetcode二叉树相关题目复习(C语言版)

目录 1.单值二叉树 2.相同的树 3.对称二叉树 4.二叉树的前序遍历 5.另一颗树的子树 1.单值二叉树 思路1: 判断根节点、左节点与右节点的值是否相等,因为正向判断(即判断三值相等返回true)比较麻烦(不能根节点满足…

第十九次博客打卡

今天学习的内容是Java中的常见循环。 在 Java 中,常见的循环结构主要有以下几种:for 循环、while 循环、do-while 循环以及增强型 for 循环(也称为 for-each 循环)。 1. for 循环 for 循环是一种非常灵活的循环结构&#xff0c…

浅聊一下数据库的索引优化

背景 这里的索引说的是关系数据库(MSSQL)中的索引。 本篇不是纯技术性的内容,只是聊一次性能调优的经历,包含到一些粗浅的实现和验证手段,所以,大神忽略即可。 额…对了,笔者对数据库的优化手段…

山东大学软件学院软件工程计算机图形学复习笔记(2025)

写在前面: 现在是考完试的第二天,考试的内容还是有一部分没有复习到的…… 根据三角形的3个顶点坐标和内部某点坐标D,写出点D的基于面积的权重坐标Bresenham的算法描述与改进策略(这里ppt上很不清晰)以及直线反走样的…

【Docker】Docker Compose方式搭建分布式内存数据库(Redis)集群

文章目录 开发环境开发流程运行效果Docker Desktop桌面中的Redis结点启动图Redis结点1的打印日志情况图 配置代码命令行启动配置文件: README.md删除集群信息新建数据目录本地Redis的结点的域名,并添加到/etc/hosts文件的末尾域名映射启动集群结点创建集群关闭集群结点 redis-c…

如何在 Bash 中使用 =~ 操作符 ?

在 Bash 脚本世界中,有各种操作符可供我们使用,使我们能够操作、比较和测试数据。其中一个操作符是 ~ 操作符。这个操作符经常被忽视,但功能非常强大,它为我们提供了一种使用正则表达式匹配字符串模式的方法。 ~ 操作符语法 语法…

科学养生指南:打造健康生活

在快节奏的现代生活中,健康养生成为人们关注的焦点。科学养生无需复杂理论,掌握以下几个关键要素,就能为身体构筑坚实的健康防线。​ 合理饮食是健康的基础。世界卫生组织建议,每天应摄入至少 5 份蔬菜和水果,保证维生…

华为OD机试真题——单词接龙(首字母接龙)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

计算机网络-MPLS VPN基础概念

前面几篇文章我们学习了MPLS的标签转发原理,有静态标签分发和LDP动态标签协议,可以实现LSR设备基于标签实现数据高效转发。现在开始学习MPLS在企业实际应用的场景-MPLS VPN。 一、MPLS VPN概念 MPLS(多协议标签交换)位于TCP/IP协…

【Linux系列】bash_profile 与 zshrc 的编辑与加载

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Spring Boot中的拦截器!

每次用户请求到达Spring Boot服务端,你是否需要重复写日志、权限检查或请求格式化代码?这些繁琐的“前置后置”工作让人头疼!好在,Spring Boot拦截器如同一道智能关卡,统一处理请求的横切逻辑,让代码优雅又…

基于 Spring Boot 瑞吉外卖系统开发(十五)

基于 Spring Boot 瑞吉外卖系统开发(十五) 前台用户登录 在登录页面输入验证码,单击“登录”按钮,页面会携带输入的手机号和验证码向“/user/login”发起请求。 定义UserMapper接口 Mapper public interface UserMapper exte…