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

news/2024/7/27 14:41:17/文章来源:https://blog.csdn.net/vince1998/article/details/137174285

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

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

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

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

在这里插入图片描述

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相关文章

Chrome浏览器 安装Vue插件vue-devtools

前言 vue-devtools 是一个为 Vue.js 开发者设计的 Chrome 插件。它可以让你更轻松地审查和调试 Vue 应用程序。与普通的浏览器控制台工具不同,Vue.js devtools 专为 Vue 的响应性数据和组件结构量身定做。 1. 功能介绍 组件树浏览:这个功能可以让你查…

网心云邀请码:KpyV3Dk7

网心云长期有效邀请码:KpyV3Dk7 新用户注册福利码:KpyV3Dk7 通过福利码注册并登录您可获得:①可得1元收益②1张14天50%加成卡③绑定设备可得1~5元不等 新手解答: 1. 有哪些设备可以安装?闲置电脑、闲置手机、闲置平…

hyper-v安装 windows10虚拟机后,登录一直是锁屏界面,无法开启增强会话

按键盘等,一直在锁屏界面,进不去,需要点击 上述图片按钮,切到 “基本会话”, 这样可以登录了; 切换到 ‘基本会话’ ,登陆后, 打开 设置--登录选项--要求 Microsoft 账户使用Windo…

elementUI this.$msgbox msgBox自定义 样式自定义 富文本

看这个效果是不是很炫?突出重点提示内容,对于用户交互相当的棒! 下来说说具体实现: let self = this const h = self.$createElement; this.$msgbox({title: null,message: h("p", {style: "margin-top:10px"}, [h("i", {class: "el-i…

c++|string模拟实现

目录 一、string.h 二、string.cpp 三、Test.cpp 对string的各种接口进行一个简易版的模拟实现,在模拟实现完之后对string的底层实现有了进一步的理解,了解大佬的编程写法思路。也算是对string有了一个小总结。 一、string.h 接口的声明。放在.h文件中…

用vscode仿制小米官网

html内容: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><link rel&quo…

奥比中光深度相机(二):PyQt5实现打开深度摄像头功能

文章目录 奥比中光深度相机&#xff08;二&#xff09;&#xff1a;PyQt5实现打开深度摄像头功能官方给出的调用深度相机源码环境精炼 UI界面设计逻辑代码构建槽函数连接提取视频流在界面中显示深度视频流注意关闭相机 总体代码效果演示运行main.py代码选择相机打开摄像头关闭摄…

NSSCTF Round#20 Basic 真亦假,假亦真 CSDN_To_PDF V1.2 出题笔记 (附wp+源码)

真亦假&#xff0c;假亦真 简介&#xff1a;java伪造php一句话马。实则信息泄露一扫就出&#xff0c;flag在/flag里面。 题目描述&#xff1a;开开心心签个到吧&#xff0c;祝各位师傅们好运~ 静态flag&#xff1a;NSS{Checkin_h4v3_4_g00D_tINNe!} /路由显示 <?php e…

6、Cocos Creator 2D 渲染组件:​Sprite 组件​

Sprite 组件 Sprite&#xff08;精灵&#xff09;是 2D/3D 游戏最常见的显示图像的方式&#xff0c;在节点上添加 Sprite 组件&#xff0c;就可以在场景中显示项目资源中的图片。 属性功能说明Type渲染模式&#xff0c;包括普通&#xff08;Simple&#xff09;、九宫格&#x…

源支付V7开源版2.99,修复各种提示错误

源支付V7开源版2.99&#xff0c;修复各种提示错误 加密说明&#xff1a;200拿来的&#xff0c;只有8.1这个文件加密&#xff0c;其他文件无任何加密&#xff0c;已修复各种提示错误 测试其他开源版安装提示错误&#xff0c;有几个文件是加密的 注&#xff1a;开发不易&#…

枚举---算法

1、定义 枚举算法&#xff1a;也称之为穷举算法&#xff0c;这种算法就是在解决问题的时候去使用所有的方式去解决这个问题&#xff0c;会通过推理去考虑事件发生的每一种可能&#xff0c;最后推导出结果。优点&#xff1a;简单粗暴&#xff0c;它暴力的枚举所有可能&#xff…

Linux 动静态库的制作,使用和加载

Linux 动静态库的制作,使用和加载 一.前置说明1.mylib.h2.mylib.c3.mymath.h mymath.c4.如何制作库 二.动静态库的制作1.静态库的制作1.制作2.使用一下静态库,验证是否成功打包 2.动态库的制作1.编译.c源文件文件生成.o目标文件2.打包生成动态库3.编写makefile文件,自动化制作动…

Spring 整合 Log4j2日志框架

1. Log4j2日志概述 在项目开发中&#xff0c;日志十分的重要&#xff0c;不管是记录运行情况还是定位线上问题&#xff0c;都离不开对日志的分析。日志记录了系统行为的时间、地点、状态等相关信息&#xff0c;能够帮助我们了解并监控系统状态&#xff0c;在发生错误或者接近某…

Go语言流程控制

条件语句需要开发者通过指定一个或多个条件&#xff0c;并通过测试条件是否为true来决定是否执行指定语句&#xff0c;并在条件为false的情况下执行另外的语句。 Go语言提供了一下几种条件判断语句 一. 条件语句if 1.1 if语句由一个布尔表达式后紧跟一个或多个语句组成 语法&a…

如何在Portainer中创建Nginx服务并搭建静态站点实现公网访问本地网站

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

牛牛排队伍

有 n 个人排队&#xff0c;1 号排在 2 号前面&#xff0c;2 号排在 3 号前面&#xff0c;…&#xff0c;以此类推 n−1 号排在 n 号前面。在这个过程中&#xff0c;偶尔老师会把某个人叫走&#xff0c;叫走之后这个人就离开了队伍&#xff0c;假设本来 a排在 b 前面&#xff0c…

SiameseRPN原理详解(个人学习笔记)

参考资源&#xff1a; 视觉目标跟踪SiamRPNSiameseRPN详解CVPR2018视觉目标跟踪之 SiameseRPN 目录&#xff09; 1. 模型架构1.1 Siamese Network1.2 RPN 2. 模型训练2.1 损失函数2.2 端到端训练2.3 正负样本选择 3. 跟踪阶段总结 SiamRPN是在SiamFC的基础上进行改进而得到的一…

Adobe ColdFusion 任意文件读取漏洞复现(CVE-2024-20767)

0x01 产品简介 Adobe ColdFusion是美国奥多比(Adobe)公司的一套快速应用程序开发平台。该平台包括集成开发环境和脚本语言,将可扩展、改变游戏规则且可靠的产品的愿景变为现实。 0x02 漏洞概述 由于 Adobe ColdFusion 的访问控制不当,未经身份认证的远程攻击者可以构造恶…

Ubuntu20.04安装MatlabR2018a

一、安装包 安装包下载链接 提取码&#xff1a;kve2 网上相关教程很多&#xff0c;此处仅作为安装软件记录&#xff0c;方便后续软件重装&#xff0c;大家按需取用。 二、安装 1. 相关文件一览 下载并解压文件后&#xff0c;如下图所示&#xff1a; 2. 挂载镜像并安装 2…

服务器被CC攻击之后怎么办?

1.取消域名绑定取消域名绑定后Web服务器的CPU能够马上恢复正常状态&#xff0c;通过IP进行访问连接一切正常。但是不足之处也很明显&#xff0c;取消或者更改域名对于别人的访问带来了不变&#xff0c;另外&#xff0c;对于针对IP的CC攻击它是无效的&#xff0c;就算更换域名攻…