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

【go】简单理解梳理go的内存分配原理

Go 内存分配机制原理

Go 的内存分配机制设计非常精细,结合了多级缓存、对象池和垃圾回收等机制,以实现高并发下的高性能分配。

1. 整体内存结构

Go 程序启动时,运行时会向操作系统申请一大块连续内存区域(heap arena),这个区域主要被划分为三个部分:

  • arena:主要用于实际存放用户对象;arena即为所谓的堆区,应用中需要的内存从这里分配。512G;arena区域划分成一个个的page,每个page为8KB,一共有512GB/8KB个页
  • bitmap:主要用于 GC使用;16G
  • spans:用来管理 arena 中的一段段页(page)资源。512M;spans区域存放span的指针,每个指针对应一个page,所以span区域的大小为(512GB/8KB)*指针大小8byte = 512M

2. 多级分配体系:MCache、MCentral、MHeap

Go 的内存分配基于分级缓存结构,具体如下:

  • MCache(线程本地缓存)
    每个 P(Processor)对应一个 MCache,是最靠近线程的分配器,分配最快,不需要加锁。

  • MCentral(中心缓存)
    所有线程共享,负责按“大小类别(size class)”管理多个 span。
    当 MCache 缺资源时,从 MCentral 拉取新的 span。

  • MHeap(堆)
    管理所有 span 和 page,从操作系统申请内存,提供大对象支持。
    MCentral 资源不足时,就会从 MHeap 拉取。

这是 “三级内存分配架构”,分别优化了不同粒度的分配效率与并发冲突。


3. 内存分配流程简述!!!

当程序需要分配内存时:

  1. 小对象(<32KB):根据 size class 直接从 MCache 中拿对象;
  2. 如果 MCache 没有,就从 MCentral 拉取 span;
  3. 如果 MCentral 没有,就从 MHeap 获取 page,构造 span;
  4. 大对象(≥32KB):直接从 MHeap 分配整页,跳过缓存层。

4. GC 与内存协同

Go 的垃圾回收器采用 并发三色标记-清除算法,与分配体系紧密协作:

  • GC 通过 bitmap 和 span 表追踪对象;
  • 在 GC 过程中会发生短暂的 STW(Stop-The-World);
  • 回收后的 span 会归还给 MCentral,再被重用。

https://github.com/0voice

相关文章:

【go】简单理解梳理go的内存分配原理

Go 内存分配机制原理 Go 的内存分配机制设计非常精细&#xff0c;结合了多级缓存、对象池和垃圾回收等机制&#xff0c;以实现高并发下的高性能分配。 1. 整体内存结构 Go 程序启动时&#xff0c;运行时会向操作系统申请一大块连续内存区域&#xff08;heap arena&#xff0…...

GStreamer 简明教程(十一):插件开发,以一个音频生成(Audio Source)插件为例

系列文章目录 GStreamer 简明教程&#xff08;一&#xff09;&#xff1a;环境搭建&#xff0c;运行 Basic Tutorial 1 Hello world! GStreamer 简明教程&#xff08;二&#xff09;&#xff1a;基本概念介绍&#xff0c;Element 和 Pipeline GStreamer 简明教程&#xff08;三…...

【阿里云大模型高级工程师ACP学习笔记】2.1 用大模型构建新人答疑机器人

学习目标 在备考阿里云大模型高级工程师ACP认证时,学习《2.1用大模型构建新人答疑机器人》这部分内容,主要是为了掌握利用大模型技术构建高效答疑机器人的方法,提升在大模型应用开发领域的专业能力。具体目标如下: 掌握大模型API调用:学会通过API调用通义千问大模型,熟悉…...

嵌入式鸿蒙系统环境搭建与配置要求实现01

各位开发者大家好,今天主要给大家分享一下,鸿蒙系统的环境配置实现。 第一:鸿蒙配置基本要求 对电脑的要求,虚拟机配置建议 200GB 硬盘大小,10GB 内存,4*2CPU。 安装必要的依赖文件方法: sudo apt-get update && sudo apt-get install binutils git git-lfs g…...

form表单提交前设置请求头request header及文件下载

需求&#xff1a;想要在form表单submit之前&#xff0c;设置一下请求头。 除了用Ajax发起请求之外&#xff0c;还可以使用FormData来实现&#xff0c;咱不懂就问。 1 问&#xff1a;FormData什么时间出现的&#xff1f;与ajax什么联系&#xff1f; 2 问&#xff1a;FormData使…...

【c++11】c++11新特性(下)(可变参数模板、default和delete、容器新设定、包装器)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C 目录 前言 五、可变参数模板 1. 概念及简单定义 2. 包扩展 六、 default和delete 七、容器新设定 1. 新容器 2. 新接口 emplace系列接口 八、函数包…...

PyTorch 实现食物图像分类实战:从数据处理到模型训练

一、简介 在计算机视觉领域&#xff0c;图像分类是一项基础且重要的任务&#xff0c;广泛应用于智能安防、医疗诊断、电商推荐等场景。本文将以食物图像分类为例&#xff0c;基于 PyTorch 框架&#xff0c;详细介绍从数据准备、模型构建到训练测试的全流程&#xff0c;帮助读者…...

Qt —— 在Linux下试用QWebEngingView出现的Js错误问题解决(附上四种解决办法)

错误提示:js: A parser-blocking, cross site (i.e. different eTLD+1) script, https:xxxx, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If bloc…...

命名空间(C++)

命名空间主要用于大型项目中。 局部命名在该局部会覆盖全局命名。C语言中唯一一种在局部调用全局相同命名的全局变量的方式&#xff1a;指针在C中可以用作用域运算符来访问全局变量&#xff0c;作用域运算符的前面可以是作用域也可以是类。 命名空间实际上是对全局作用域的再次…...

使用Python脚本在Mac上彻底清除Chrome浏览历史:开发实战与隐私保护指南

题目&#xff1a; 《基于PyCharm与Mac系统的Chrome历史记录清理工具开发实战》 引言 在Mac系统下&#xff0c;Chrome浏览器的历史记录文件通常以SQLite数据库形式存储于用户目录中&#xff0c;仅通过浏览器内置功能清理可能残留索引文件。本文通过一个Python脚本&#xff08;c…...

LabVIEW圆锥滚子视觉检测系统

基于LabVIEW平台的视觉检测系统提高圆锥滚子内组件的生产质量和效率。通过集成高分辨率摄像头和先进的图像处理算法&#xff0c;系统能够自动识别和分类产品缺陷&#xff0c;从而减少人工检查需求&#xff0c;提高检测的准确性和速度。 ​​ ​ 项目背景 随着制造业对产品质…...

OpenAI 推出「轻量级」Deep Research,免费用户同享

刚刚&#xff0c;OpenAI 正式上线了面向所有用户的「轻量级」Deep Research 版本&#xff0c;意味着即便没有付费订阅&#xff0c;也能体验这一强大工具的核心功能。 核心差异&#xff1a;o4-mini vs. o3 模型迭代 传统的深度研究功能基于更大规模的 o3 模型。轻量级版本则改以…...

罗伯·派克:Go语言创始者的极客人生

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 罗伯派克&#xff1a;Go语言创始者的极客人生 一、传奇程序员的成长历程 1. 早年经历…...

面试题:Redis 一次性获取大量Key的风险及优化方案

Redis 一次性获取大量Key的风险及优化方案 在Redis中一次性获取大量Key&#xff08;如使用KEYS命令或大量GET操作&#xff09;会带来多种风险和性能问题&#xff0c;以下是详细分析和解决方案&#xff1a; 主要风险 1. 阻塞风险 KEYS命令阻塞&#xff1a;KEYS *会扫描整个数…...

中国头部云服务商分析

1. 阿里云 国内云服务的开创者与龙头&#xff0c;占据约三分之一的国内市场份额&#xff0c;其中IaaS占比72%&#xff0c;PaaS与SaaS占比相对较小 全球范围内500万客户&#xff0c;基础设施目前面向全球四大洲&#xff0c;开服运营15个国家、30个公共云地域、89个可用区&#x…...

关于使用git init --bare 裸仓库的使用

1、创建文件夹 对于需要作为仓库的文件夹使用git init --bare进行裸仓库初始化 2、将裸仓库添加为自己的远程仓库 使用的方法和添加远程仓库的方式相同&#xff0c;但是路径需要为绝对路径&#xff0c;同时需要加入file:///协议 git remote add origin file:///d:/Desktop/Lo…...

解释一下计算机中的内存对齐

1. 内存对齐的基本概念 内存对齐是计算机系统优化内存访问效率的一种机制&#xff0c;要求数据在内存中的起始地址必须为某个值的整数倍&#xff08;通常为数据类型大小的整数倍&#xff09;。例如&#xff1a; int (4字节) 应对齐到4的倍数地址&#xff08;如0x00, 0x04, 0x…...

小白工具视频转MPG, 功能丰富齐全,无需下载软件,在线使用,超实用

在视频格式转换需求日益多样的今天&#xff0c;小白工具网的在线视频转 MPG 功能https://www.xiaobaitool.net/videos/convert-to-mpg/ &#xff09;脱颖而出&#xff0c;凭借其出色特性&#xff0c;成为众多用户处理视频格式转换的优质选择。 从格式兼容性来看&#xff0c;它支…...

跟着deepseek学golang--认识golang

文章目录 一、Golang核心优势1. 极简部署方式生产案例​​&#xff1a;依赖管理​​&#xff1a;容器实践​​&#xff1a; 2. 静态类型系统​​类型安全示例​​&#xff1a;性能优势​​&#xff1a;​​代码重构​​&#xff1a; 3. 语言级并发支持​​GMP调度模型实例​​&…...

目前市面上知名的数据采集器

程序员爱自己动手打造一切&#xff0c;但这样离钱就会比较远。 市面上知名的数据采集工具 数据采集工具&#xff08;也称为网络爬虫或数据抓取工具&#xff09;在市场上有很多选择&#xff0c;以下是目前比较知名和广泛使用的工具分类介绍&#xff1a; 一、开源免费工具 Scra…...

问答页面支持拖拽和复制粘贴文件,MaxKB企业级AI助手v1.10.6 LTS版本发布

2025年4月24日&#xff0c;MaxKB开源企业级AI助手正式发布v1.10.6 LTS版本。这一版本主要进行了一些功能优化和问题修复。 功能优化 ■ 应用&#xff1a;文件上传支持上传其他自定义的文件类型&#xff0c;该类型文件需要自行写入函数解析&#xff1b; ■ 问答页面&#xff…...

day32 学习笔记

文章目录 前言一、霍夫变换二、标准霍夫变换三、统计概率霍夫变换四、霍夫圆变换 前言 通过今天的学习&#xff0c;我掌握了霍夫变换的基本原本原理及其在OpenCV中的应用方法 一、霍夫变换 霍夫变换是图像处理中的常用技术&#xff0c;主要用于检测图像中的直线&#xff0c;圆…...

二项分布详解:从基础到应用

二项分布详解&#xff1a;从基础到应用 目录 引言二项分布的定义概率质量函数及其证明期望与方差推导二项分布的重要性质常见应用场景与其他分布的关系知识梳理练习与思考 引言 概率论中&#xff0c;二项分布是最基础也是最常用的离散概率分布之一。它描述了在固定次数的独…...

CentOS 7上Memcached的安装、配置及高可用架构搭建

Memcached是一款高性能的分布式内存缓存系统&#xff0c;常用于加速动态Web应用的响应。本文将在CentOS 7上详细介绍Memcached的安装、配置&#xff0c;以及如何实现Memcached的高可用架构。 &#xff08;1&#xff09;、搭建memcached 主主复制架构 Memcached 的复制功能支持…...

如何让 HTML 文件嵌入另一个 HTML 文件:详解与实践

目录 一、为什么需要在HTML中嵌入其他HTML文件&#xff1f; 二、常用的方法概览 三、利用 1. 基本原理 2. 使用场景 3. 优缺点 4. 实践示例 5. 适用建议 四、利用JavaScript动态加载内容 1. 原理简介 2. 实现步骤 示例代码 3. 优缺点分析 4. 应用场景 5. 实践建…...

mac brew 无法找到php7.2 如何安装php7.2

mac brew 无法找到php7.2 如何安装php7.2 原因是升级过高版本的brew后已经不支持7.2了&#xff0c;但可以通过第三方工具来安装 brew tap shivammathur/php brew install shivammathur/php/php7.2标题安装完成后会提示以下信息&#xff1a; The php.ini and php-fpm.ini fil…...

人工智能与机器学习:Python从零实现逻辑回归模型

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…...

windows服务器及网络:搭建FTP服务器

前言&#xff1a;&#xff08;各位大佬们&#xff0c;昨天太忙了&#xff0c;整得没有发布昨天那该写的那一篇&#xff0c;属实有点可惜的说QAQ&#xff0c;不过问题已经解决&#xff0c;我又回来啦&#xff09; 今天我要介绍的是在Windows中关于搭建FTP服务器的流程与方法 注…...

Python学习之路(五)-接口API

在 Python 中结合数据库开发接口 API 通常使用 Web 框架(如 Flask 或 Django)和 ORM(对象关系映射)工具(如 SQLAlchemy 或 Django ORM)。以下是使用 Flask 和 SQLAlchemy 的详细步骤,展示如何结合数据库开发一个简单的 API。 使用 Flask 和 SQLAlchemy 开发 API 1. 安…...

欧拉计划 Project Euler56(幂的数字和)题解

欧拉计划 Project Euler 56 题解 题干思路code 题干 思路 直接暴力枚举即可&#xff0c;用c要模拟大数的乘法&#xff0c;否则会溢出 code // 972 #include <bits/stdc.h>using namespace std;using ll long long;string mul(const string &num1, int num2) {int…...