go内存管理机制

news/2024/11/24 6:26:57/

golang内存管理基本是参考tcmalloc来进行的。go内存管理本质上是一个内存池,只不过内部做了很多优化:自动伸缩内存池大小,合理切割内存块

 

基本概念:

Page:页,一块 8 K大小的内存空间。Go向操作系统申请和释放内存都是以页为单位。

span:内存块,一个或多个page组成一个span。如果把page比喻成工人,span可以看成是小队,工人被分成若干个队伍,不同的队伍干不同的活。

sizeclass:空间规格,每个span都带有一个sizeclass,标记着该span中的 page 应该如何使用。使用上面的比喻,就是sizeclass标志着 span 是一个什么样的队伍。

object:对象,用来存储一个变量数据内存空间,一个span在初始化时,会被切割成一堆等大的object。假设object的大小是 16B,span大小是 8K,那么就会把 span 中的 page 共初始化为 8k/16B = 512 个 object。所谓内存分配就是分配一个object出去。

mheap

一开始 go从操作系统索取一大块内存作为内存池,并放在一个叫mheap的内存池进行管理,mheap将一整块内存切割为不同的区域,并将每一部分内存切割为合适的大小。

 mheaps.spans:用来存储 page 和 span 信息,比如每一个 span 的起始地址是多少,有几个 page ,已使用了多少page等等

mheap.bitmap:保存arena对应的某个地址是否存在对象,以及对象是否被gc扫描过,主要用于gc

mheap.arena_start:将要分配给应用程序使用的空间(由一个个page组成)。


mcentral

用途相同的 span 会以链表的形式组织在一起存放在 mcentral 中。这里用途用sizeclass来表示,就是该 span 存储到哪种大小的对象。

找到合适的 span 后,会从中取出一个 object 返回给上层使用


 

mcache

为了提高内存并发申请效率,加入缓存层mcache。每一个mcache和处理器P对应。Go申请内存首先从P的mcache中分配,如果没有可用的span再从mcentral中获取。

 


http://www.ppmy.cn/news/1031553.html

相关文章

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库,一套典型的移动端办公工具型APP Axure RP原型模板,可根据实际的产品需求进行扩展,也可以作为移动端原型设计的参考案例。为提升本作品参考价值,在模板设计过程中尽量追求…

代码生成模型任务设计

背景: 模型应该具备,理解代码的能力、知道代码规则的能力、知道关键词和变量的能力、知道代码逻辑的能力、文本到代码翻译能力、代码关联能力、代码续写能力。 代码理解能力:pretrain让模型读足够多代码、记住代码一些规则、代码问答、基于…

【LeetCode每日一题】——128.最长连续序列

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 中等 三【题目编号】 128.最长连续序列 四【题目描述】 给定一个未…

机器学习笔记之优化算法(十二)梯度下降法:凸函数VS强凸函数

机器学习笔记之优化算法——梯度下降法:凸函数VS强凸函数 引言凸函数:凸函数的定义与判定条件凸函数的一阶条件凸函数的梯度单调性凸函数的二阶条件 强凸函数强凸函数的定义强凸函数的判定条件强凸函数的一阶条件强凸函数的梯度单调性强突函数的二阶条件…

Nginx之lnmp架构

目录 一.什么是LNMP二.LNMP环境搭建1.Nginx的搭建2.安装php3.安装数据库4.测试Nginx与PHP的连接5.测试PHP连接数据库 一.什么是LNMP LNMP是一套技术的组合,Llinux,Nnginx,Mmysql,Pphp 首先Nginx服务是不能处理动态资源请求&…

java高并发系列 - 第14天:JUC中的LockSupport工具类,必备技能

java高并发系列 - 第14天:JUC中的LockSupport工具类,必备技能 java高并发系列第14篇文章 本文主要内容: 讲解3种让线程等待和唤醒的方法,每种方法配合具体的示例介绍LockSupport主要用法对比3种方式,了解他们之间的区别LockSupport位于java.util.concurrent(简称juc)包…

版本控制工具——git

版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。 版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变,文件的…

Kotlin读写分离CopyOnWriteArrayList

Kotlin读写分离CopyOnWriteArrayList 基于读写分离思想Copy-On-Write(COW)设计的线程安全ArrayList变体,读读共享、写写互斥、读写互斥、写读互斥。读时直接读,不用加锁同步,线程安全。写/删/修改数据时复制一个副本,在新的List副…