Golang 内存管理和垃圾回收底层原理(一)

一、这篇文章我们来聊聊Golang内存管理和垃圾回收,主要注重基本底层原理讲解,进一步实战待后续文章

1、这篇我们来讨论一下Golang的内存管理
先上结构图
在这里插入图片描述

从图我们来讲Golang的基本内存结构,内存结构可以分为:协程缓存中央缓存页堆,还有底层的虚拟内存,虚拟内存我们不用太关心,可以看成操作系统那一层面的内容。

其实看到Golang的内存结构,其实和操作系统的内存管理的道理是相同的。

为什么需要在协程基本上设立一个缓存区域?

目的就是为了访问加速,让一部分内存单元直接属于某个协程。如果没有这种协程缓存,每个协程都从公共中央缓存中,抢占内存单元,会发生很多资源抢占并发安全问题,得不偿失。

那么中央缓存是干啥的,图我们可以看到中央缓存有多个的,为了便于理解(如有错误,请评论区指正),笔者表述为每个中央缓存都会统一管理某个类别下的内存管理单元,一个类别或者说某个中央缓存下,可能包含了多个协程需要的内存单元。

对于每个中央缓存的内存单元,属于该类别的协程来申请内存单元时,申请是要加锁的,可以一个看到共性,对于公共区域,为了保证访问的一致性,对于资源的占用,都是要加锁的。

那么这里就会有一个问题,这些内存单元如何进行管理的,总不可能看到一个内存单元,看一下他能不能用吧?这太傻了吧。

所以,在各级别缓存中,对于内存管理单元,分为空闲内存单元已使用的内存单元区域,在每个类别区域下,根据内存单元大小进行分类,每个类别下构成一个以内存单元为节点的单链表。那么协程申请内存的时候,其实是需要根据你申请对象大小,来决定你的内存单元是从协程缓存中央缓存页堆的哪个进行分配。后续我们再讲这个问题。

那页堆是干嘛的,如果你是学过Java,也可以直接理解成堆,不过既然是讲Golang,我们给出一个稍微规范一点的定义,他就是管理全局内存单元的,所有内存单元都来自于页堆。

前面我们已经说了,内存管理单元在各级内存空间中,是如何进行管理的,那么申请一个对象是如何申请的,笔者给一个口语化理解

Golang申请内存单元的行为,根据申请内存大小分为了微小大对象,针对大对象(32KB以上)的内存分配可能直接申请页堆内存管理单元微、小对象可以在协程缓存或中央缓存进行申请,如果上一级内存空间不足时,会向下一级内存空间申请内存管理单元,这里说的级别协程缓存中央缓存页堆,级别从左到右依次递增。从中央缓存开始,申请内存单元时要加锁的。

哈哈,有说的不对的地方敬请指教,写文不易,给俺一个点赞和收藏吧哈哈。

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

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

相关文章

php phar反序列化POC编写笔记

具体结构不细究,主要方便写poc代码,比如有如下文件内容: 文件内容如下: file base64.b64decode("PD9waHAgX19IQUxUX0NPTVBJTEVSKCk7ID8DQp9AQAAAQAAABEAAAABAAAAAABHAQAATzo0MDoiSWxsdW1pbmF0ZVxCcm9hZGNhc3RpbmdcUGVuZG…

宝塔面板提示当前未安装docker或docker-compose有效解决方案!

宝塔面板提示当前未安装docker或docker-compose有效解决方案! 首先点面板的安装docker后依旧提示【当前未安装docker或docker-compose,点击安装】,解决方法就是输入两条命令后刷新即可,命令ln -s /usr/local/bin/docker-compose /usr/bin/doc…

Flask Python:如何获取不同请求方式的参数

Flask中 如何获取不同请求方式的参数 前言一、get请求下1.1、路径中带有参数1.1.1、postman示例1.1.2、 flask代码实现1.1.3、 注意事项 1.2、在url后边带有参数1.2.1、postman示例1.2.2、 flask代码实现 二、post请求下2.1、form-data格式2.1.1、postman示例2.1.2、flask代码实…

蓝桥杯-dfs搜索模板题(一)

蓝桥杯-dfs搜索模板题&#xff08;一&#xff09; P2089 烤鸡P1088 火星人P1149 火柴棒等式P2036 PERKETP1135 奇怪的电梯结语 P2089 烤鸡 对于每个位置枚举数字 #include<bits/stdc.h>using namespace std;const int N1010;int n;int arr[N];//临时方案 int res0;//方案…

AI音乐GPT时刻来临:Suno 快速入门手册!

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

搜索二维矩阵 II - LeetCode 热题 21

大家好&#xff01;我是曾续缘&#x1f497; 今天是《LeetCode 热题 100》系列 发车第 21 天 矩阵第 4 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&…

软件架构风格_2.调用/返回体系结构风格

调用/返回风格是指在系统中采用了调用与返回机制。利用调用-返回实际上是一种分而治之的策略&#xff0c;其主要思想是将一个复杂的大系统分解为若干子系统&#xff0c;以便降低复杂度&#xff0c;并且增加可修改性。程序从其执行起点开始执行该构件的代码&#xff0c;程序执行…

Groovy 介绍、下载、语法

Groovy 简介 Groovy 可以被视为Java 的一种脚本化改良版&#xff0c;Groovy 也是运行在 JVM 上&#xff0c;可以很好地与 Java 代码及其相关库进行交互操作。Groovy 是一种成熟的面向对象编程语言&#xff0c;既可以面向对象编程&#xff0c;又可以用作纯粹的脚本语言。大多数…

融资融券有什么优点和缺点?融资利率和费率多少?

融资融券是一种证券信用交易&#xff0c;指投资者向具有融资融券业务资格的证券公司提供担保物&#xff0c;借入资金买入证券或者借入证券并卖出的行为 融资融券的优点有&#xff1a; 增加交易资金。投资者可以通过融资融券账户&#xff0c;向证券公司借入资金&#xff0c;增加…

sa-token非Web上下文无法获取Request

0x02 非Web上下文无法获取Request 问题定位 在我们使用sa-token安全框架的时候&#xff0c;有时候会提示&#xff1a;**SaTokenException:非Web上下文无法获取Request**** 错误截图&#xff1a; 在官方网站中&#xff0c;查看常见问题排查&#xff1a; 非Web上下文无法获取…

QT使用数据库和proC数据库

一&#xff0c;QT使用数据库 数据库就是保存数据的文件。可以存储大量数据&#xff0c;包括插入数据、更新数据、截取数据等。用专业术语来说&#xff0c;数据库是“按照数据结构来组织、存储和管理数据的仓库”。 什么时候需要数据库&#xff1f;在嵌入式里&#xff0…

每日一题(leetcode169):多数元素-哈希、随机、分治

哈希&#xff1a; class Solution { public:int majorityElement(vector<int>& nums) {int lennums.size();unordered_map<int,int> map;for (int i0;i<len;i){if(map.find(nums[i])map.end()){map[nums[i]]1;}else{map[nums[i]];}}int seqlen/2;int ansnu…

FebHost:注册人工智能.AI域名的优势?

近年来,人工智能技术的飞速发展,让AI在各行各业扮演着愈发重要的角色。在这一背景下,.AI域名凭借其独特的优势,正成为越来越多AI从业者的首选。那么,.AI域名到底有哪些亮点,值得广大AI企业和个人关注呢?记者进行了深入探访。 专业形象加分 彰显技术实力 要说.AI域名的最大优势…

yolov5关键点检测-实现溺水检测与警报提示(代码+原理)

基于YOLOv5的关键点检测应用于溺水检测与警报提示是一种结合深度学习与计算机视觉技术的安全监控解决方案。该项目通常会利用YOLOv5强大的实时目标检测能力&#xff0c;并通过扩展或修改网络结构以支持人体关键点检测&#xff0c;来识别游泳池或其他水域中人们的行为姿态。 项…

为何网易游戏会选择引入OceanBase数据库

本文作者&#xff1a;田维繁&#xff0c;网易游戏关系型数据库小组负责人 作为中国游戏开发领域的佼佼者&#xff0c;网易游戏始终站在网络游戏自主研发的前沿。其产品及周边产品线丰富多样&#xff0c;因此&#xff0c;为满足各种业务场景的需求&#xff0c;需要多种不同的数据…

delphi获取windows右下角任务栏图标信息

今天在群里,看有人问怎么获取windows右下角任务栏图标信息 win7 x64 测试通过 unit Unit1;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs,commctrl, Vcl.StdCtr…

烂笔头笔记:Windows 11下照片查看器显示偏色问题修复

本文出处&#xff1a;http://blog.csdn.net/chaijunkun/article/details/137278931&#xff0c;转载请注明。由于本人不定期会整理相关博文&#xff0c;会对相应内容作出完善。因此强烈建议在原始出处查看此文。 最近在研究HDR视频的截图算法&#xff0c;目的就是生成色彩正确…

并发编程01-深入理解Java并发/线程等待/通知机制

为什么我们要学习并发编程&#xff1f; 最直白的原因&#xff0c;因为面试需要&#xff0c;我们来看看美团和阿里对 Java 岗位的 JD&#xff1a; 从上面两大互联网公司的招聘需求可以看到&#xff0c; 大厂的 Java 岗的并发编程能力属于标配。 而在非大厂的公司&#xff0c; 并…

如何在 Android 上恢复已删除的短信

在 Android 上恢复短信是一件棘手的事情。以下是限制、您的选择以及如何为未来做好准备。 丢失手机数据令人心碎。无论您不小心删除了某些内容&#xff0c;还是手机被盗或损坏&#xff0c;您不可替代的照片、亲人的消息等都可能会立即消失。 如果您需要从 Android 手机恢复一…

腾讯云最新活动及优惠券领取入口整理汇总

腾讯云作为国内领先的云服务提供商&#xff0c;始终致力于为广大用户提供更优质、更便捷的云服务体验。为了帮助用户更好地了解和参与腾讯云的活动&#xff0c;本文将对腾讯云的最新活动及优惠券领取入口进行整理汇总。 一、优惠券领取入口 领取入口&#xff1a;点此领取 领券…