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

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

垃圾回收,无论是Java 还是 Golang,基本的逻辑都是基于 标记-清理 的,

标记是指标记可能需要回收的对象,那么标记的方式是什么呢?

无论是Java还是Golang,标记的方式的逻辑都可以表示为 “三色标记法”,三色标记法用图表示的话,可以看成这样

在这里插入图片描述

那么如果要我们以语言去表示,笔者可以提供一个个人理解的表述,从根对象开始,以引用链的方式,广度优先搜索方法,将所有能够与根结点形成直接或间接引用链进行标记,未标记的对象就是需要回收的对象

什么是根对象,一般来说根对象包括栈上变量全局变量

标记其实是要占据CPU资源的,或者说需要STW用户程序,如果有太多的对象需要进行标记,可能会导致用户程序感觉到卡顿,造成服务体验卡顿

为了降低卡顿时间,目前标记的方式都是基于并发标记,这样就能解决上面的问题。但是,我们也知道,并发可能会造成并发变量的不安全性或不一致性

那么为了保证标记过程或者被标记对象的并发安全性或者一致性,无论是Java还是Golang,在标记指令前或后,都会插入一个叫“屏障”的原语指令,保证并发标记安全或一致性。不过Java可能采取的是写前屏障或者其他,Golang采用的是“混合屏障”。

那么什么是混合屏障混合是由什么混合的呢?为什么要混合?

一般来说,屏障可以分为“插入写屏障”和“删除写屏障”。

插入写屏障可以理解为在标记()对象前插入屏障(原语指令),保证一个对象标记过程,不会被多个协程同时修改。但是,对于栈上的变量,由于屏障是一种消耗时间的行为,为了保证栈快进快出的特点,所以对于栈上的变量的标记,是不会插入屏障的,那么对于栈上的需要回收的对象,需要在完成第一轮标记后,对栈再进行一次标记。那么写屏障的缺点,很明显,就是需要二次标记,单独对栈重新标记。

删除后屏障”就是在删除一个对象引用链后插入一个屏障进行标记的行为,具体删除后屏障的过程不多进行解释,他的缺点就是标记精度没那么高,但是不需要二次标记

那么Golang结合“插入写屏障”和“删除后屏障”的优缺点,避免二次标记和精度缺失的问题,对于新对象栈上的对象都直接标记为非回收对象,即直接标记为黑色

那么标记过程我们已经清楚,那么我们来说一下Golang谁来进行标记行为的。在Golang里我们一般讲的是协程,所以负责标记的包含三种协程

1)默认的标记协程
2)每个处理器都有一个辅助标记协程,只有处理器空闲的时候才会进行辅助标记
3)当内存不足时,来申请内存的协程也会帮助标记,标记数量取决于申请的

标记完成后,统一放到一个叫工作池里进行垃圾对象回收。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

日记本(源码+文档)

日记本(小程序、ios、安卓都可部署) 文件包含内容程序简要说明功能项目截图客户端首页日记列表 书写日记个人中心设置密码锁拨打客服热线修改信息退出登录登录页输入密码锁注册页 后端管理登录页首页管理员列表管理用户管理日记列表管理日记数据 文件包含…

Spring Boot项目启动速度优化

1、配置自动配置排除列表,减少启动自动配置扫描,配置项spring.autoconfigure.exclude 2、启动类添加索引注解Indexed,去除启动过程中 Components 的扫描步骤,直接从索引文件读取。 import org.springframework.stereotype.lndexe…

基于springboot的房屋租赁系统平台

功能描述 流程:房主登陆系统录入房屋信息》发布租赁信息(选择房屋)》租客登陆系统浏览租赁信息》和房主联系、看房(根据租赁信息单的电话线下沟通)》房主发起签约(生成邀请码)》租客登陆系统根…

Qt加载.css/.qss文件设置控件的QSS样式(支持程序运行时修改且立即生效类似换肤效果)

初学Qt时要想通过QSS修改控件QWidget,QPushButton等原生基础控件的样式,一般都是直接在.ui文件中直接添加qss,或者在代码中通过setStyleSheet(QString qss)来设置。当程序很大时,很多地方需要复用样式时会非常麻烦,qss…

QA测试开发工程师面试题满分问答3: python的深拷贝和浅拷贝问题

在 Python 中,深拷贝(deep copy)和浅拷贝(shallow copy)是用于创建对象副本的两种不同方式。 浅拷贝是创建一个新的对象,该对象与原始对象的内容相同(包括内部嵌套对象的引用)&…

SBCFormer:能够在单板计算机上以每秒1帧的速度进行全尺寸ImageNet分类的轻量级网络

摘要 https://arxiv.org/ftp/arxiv/papers/2311/2311.03747.pdf 计算机视觉在解决包括智能农业、渔业和畜牧业管理等不同领域的实际问题中变得越来越普遍。这些应用可能不需要每秒处理许多图像帧,因此从业者倾向于使用单板计算机(SBCs)。尽管…

Pytorch数据结构:Tensor

文章目录 Tensor基础1.1、Tensor的维度(Dimensions)1.1.1、举例说明1.1.2、高维Tensor 1.2、.dim()和.size()方法1.2.1、.dim()方法1.2.2、.size()方法1.2.3、.shape属性1.2.3、示例代码1.2.3.1、一维Tensor1.2.3.2、二维Tensor1.2.3.3、三维Tensor 1.3、…

【Go】十五、接口、多态、断言

文章目录 1、接口的引入2、接口3、接口的注意点4、多态5、断言6、Type Switch 1、接口的引入 以日常生活中打招呼为例,定义接口规范,各国人为打招呼为具体的实现 package main import "fmt"//接口的定义:定义规则、定义规范&…

存内领域前沿,基于忆阻器的存内计算----浅析忆阻存内计算

目录 一.概念浅析 二.忆阻器的分类 三.基于忆阻器的存内计算原理 四.存内计算的实验研究 一.概念浅析 1.存内计算 存内计算(In-Memory Computing,简称 IMC)是一种将数据处理和存储紧密结合在一起的计算方式。它的主要思想是在存储设备中直…

Navicat设置mysql权限

新建用户: 注意:如果不生效执行刷新命令:FLUSH PRIVILEGES; 执行后再重新打开查看; 查询权限命令:1234为新建的用户名,localhost为访问的地址 SHOW GRANTS FOR 1234localhost;如果服务器设置服务器权限后可能会出现权…

某东手势验证

地球上最强版!!!!!!!! 成功率99 基本不失败!!!!!!!!!! 识别速…

ZCMU操作系统课程实验 - 实验1-Linux的使用

登录 1. 打开这个东西 2. 在 文件 - > 打开 中打卡机房里VMOS文件里的这个东东 3. 然后依次操作下去好了,有红色的选项,我都是选的"Do nothing"。完成后就会出现这样一个黑框框。 4. 让你登录。输入:root。密码&…

Excel制作甘特图

使用Excel表格制作甘特图,可根据任务开始时间和结束时间自动计算工时,并自动用指定颜色填充横道图。 1.新建Excel文档,先设置项目基本信息,包括表格名称,这里设置为“**项目甘特图”;然后添加任务序号列&a…

前后端实现下拉框带条件查询(Vue+Java)

目录 前言1. 前端2. 后端 前言 对于该基本知识熟门熟路,对此总结一套自身的模版如下 总体逻辑如下:通过前端下拉框或者其他组合框(多选勾选查询),将条件返回给后端处理,后端查询数据库,查询得…

【Servlet】Servlet入门

文章目录 一、介绍二、入门案例导入servlet-api的解决办法 一、介绍 概念:server applet,即:运行在服务器端的小程序 Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。 将来我们定义…

bugku-web-速度要快

发现phpsessid 从上述提示 提示发送post请求,并且带有参数margin 发送后发现报文头部有一个字段叫flag,但好像每一次flag都不一样 构建Python脚本 request requests.Session()data {margin:find, } for i in range(50):html request.post(urlhttp:/…

JS详解-class-类的核心语法关于ES6与ES5

class基本核心语法: //定义类class Person{//公有属性(推荐此处定义)name// 定义属性并设置默认值price 100//构造函数constructor(name,age){// 构造函数内部的this实例化对象this.name namethis.age age// 动态添加属性(不推荐,查找麻烦)this.rank …

位运算算法(1)

目录 一、算法简述 191. 位1的个数 一、题目描述 二、思路解析 三、代码 338.比特位计数 一、题目描述 二、思路解析 三、代码 461.汉明距离 一、题目描述 二、思路解析 三、代码 声明:本博客涉及到的三道题均为一种做法的总结,建议先了解做…

ansible-tower安装

特别注意:不需要提前安装ansible,因为ansible tower中的setup.sh脚本会下载对应的ansible版本 ansible tower不支持Ubuntu系统,对cenos系统版本也有一定的限制,建议使用centos7.9。 准备一台全新的机器安装,因为ansible tower需要…

RISC-V/ARM mcu OpenOCD 调试架构解析

Risc-v/ARM mcu OpenOCD 调试架构解析 最近有使用到risc-v的单片机,所以了解了下risc-v单片机的编译与调试环境的搭建,面试时问到risc-v的调试可参看以下内容。 risc-v根据官方的推荐,调试器服务是选择OpenOCD,DopenOCD(开放片上…
最新文章