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

news2024/11/25 13:53:56

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

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

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

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

在这里插入图片描述

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相关文章

Java设计之道:色即是空,空即是色

0.引子 我们的这个世界上,存在这么一种东西: 第一:它不占据任何3D之体积,即它没有Volume第二:它也不占据任何2D之面积,即它没有Area第三:它也不占据任何1D之长度,即它没有Length 总…

【容易不简单】love 2d Lua 俄罗斯方块超详细教程

源码已经更新在CSDN的码库里: git clone https://gitcode.com/funsion/love2d-game.git 一直在找Lua 能快速便捷实现图形界面的软件,找了一堆,终于发现love2d是小而美的原生lua图形界面实现的方式。 并参考相关教程做了一个更详细的&#x…

【深耕 Python】Data Science with Python 数据科学(7)书352页练习题

写在前面 关于数据科学环境的建立,可以参考我的博客: 【深耕 Python】Data Science with Python 数据科学(1)环境搭建 往期数据科学博文: 【深耕 Python】Data Science with Python 数据科学(2&#xf…

苹果开发者账号注册步骤中的常见疑问解答与技巧分享

转载:注册苹果开发者账号的方法 在2020年以前,注册苹果开发者账号后,就可以生成证书。 但2020年后,因为注册苹果开发者账号需要使用Apple Developer app注册开发者账号,所以需要缴费才能创建ios证书了。 所以新政策出…

算法系列--递归,回溯,剪枝的综合应用(3)

💕"对相爱的人来说,对方的心意,才是最好的房子。"💕 作者:Lvzi 文章主要内容:算法系列–递归,回溯,剪枝的综合应用(3) 大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(3),带来几…

深入浅出:大模型产业链的全景解码

大模型产业仿佛如同一场盛宴,虽然AGI的菜肴还没有上桌,但掩盖不住的香味已经让所有人垂涎,都希望自己将来在餐桌上能够“吃饱饱”。这也是一场没有邀请函的宴席,从尚在学校的学生到公司的决策层,都能在生成式AI的相关研…

简单而复杂的Python

Python是一种简单&复杂的编程语言。简单的时候可以到极致: print(hello world!)另一方面,Python 也具有许多复杂的语法特性,例如面向对象编程、装饰器、迭代器、生成器等等。这些特性使得 Python 适用于各种不同的编程任务和项目。 当我…

【JavaWeb】Day31.SpringBootWeb请求响应——分层解耦(二)

3.IOC&DI 3.1 IOC&DI入门 完成Controller层、Service层、Dao层的代码解耦 思路: 1. 删除Controller层、Service层中new对象的代码 2. Service层及Dao层的实现类,交给IOC容器管理 3. 为Controller及Service注入运行时依赖的对象 Controller程序…

HarmonyOS 应用开发之同步任务开发指导 (TaskPool和Worker)

同步任务是指在多个线程之间协调执行的任务,其目的是确保多个任务按照一定的顺序和规则执行,例如使用锁来防止数据竞争。 同步任务的实现需要考虑多个线程之间的协作和同步,以确保数据的正确性和程序的正确执行。 由于TaskPool偏向于单个独…

【Java代码审计】SSTI模板注入篇

【Java代码审计】SSTI模板注入篇 1.概述2.Velocity 模板引擎3.Thymeleaf 模板注入复现普通url作为视图 4.SSTI 漏洞修复白名单控制跳转模版设置response参数 1.概述 模板引擎支持使用静态模板文件,在运行时用 HTML 页面中的实际值替换变量/占位符,从而让…

蓝桥杯刷题第六天(昨天忘记发了)

今天想从不一样的角度来解题:从时间紧张暴力求解到思路阔达直接通过所有案例 暴力方法: 思路第一眼看到这个问题我就想到了第一个思路就是先用两个数组一个存石子数一个存颜色状态,每次遍历一遍看看有没有相邻石子颜色一样且为和最小的。 im…

如何整合当地商家资源?如何进行二次变现?

随着市场竞争的日益激烈,商家们纷纷寻求创新的营销方式来扩大市场份额、提升品牌影响力。异业联盟作为一种新型的商业合作模式,正逐渐受到业界的关注和认可。本文将探讨异业联盟的可行性,并分析其是否可以通过小程序形式实现更广泛的应用。 一…

zip解压异常java.lang.IllegalArgumentException: MALFORMED处理

使用hutool解压zip包时出错: //压缩包解压到固定目录 ZipUtil.unzip(tempZipFile,dir);在解压文件的时候报错,原因是压缩文件中有中文;导致错误,解决办法是设置编码: ZipFile tempZipFile new ZipFile(zipFile, Cha…

h5 笔记1

Internet是InternationalNetwork的缩写,又称“因特网”。它是将全世界数以千计的上网设备通过TCP/IP通信协议连接在一起。Internet上的服务众多,主要的服务有WWW(万维网)、E-Mail(电子邮件)、FTP(FileTransferProtocol,文件传输协议)、Telnet…

Ps:颜色查找

颜色查找 Color Lookup命令通过应用预设的 LUT 来改变图像的色彩和调性,从而为摄影师和设计师提供了一种快速实现复杂色彩调整的方法,广泛应用于颜色分级、视觉风格的统一和创意色彩效果的制作。 Ps菜单:图像/调整/颜色查找 Adjustments/Colo…

微信小程序-文字转语音(播放及暂停)

1、使用微信小程序的同声传译功能 小程序平台-设置-第三方设置-插件管理-新增同声传译插件 小程序app.json文件配置 "plugins": {"WechatSI": {"version": "0.3.5","provider": "wx069ba97219f66d99"}},小程序中…

python生物信息多组学大数据深度挖掘与论文整理技巧技术应用

生物信息广泛涵盖基因组学、蛋白组学、系统生物学、表观遗传、非编码等前沿领域以及药物设 计、基因工程等应用领域。与传统的理论和实验学科不同,生物信息是一门数据科学,这就需要从业 者具备一定数据收集、管理、处理和分析的能力。在海量的组学数据面…

一文搞懂:Java项目线上故障处理和调优的基本方法

一. 调优和故障处理的方向 Java调优通常指的是对Java应用程序进行性能优化和资源管理的过程。调优的方向很多也很广,比如: 内存管理:优化Java应用程序的内存使用,包括减少内存泄漏、合理设置堆大小、优化垃圾收集器的选择和参数…

PyQt qrc2py 使用PowerShell将qrc文件转为py文件并且将导入模块PyQt或PySide转换为qtpy模块开箱即用

前言 由于需要使用不同的qt环境(PySide,PyQt)所以写了这个脚本,使用找到的随便一个rcc命令去转换qrc文件,然后将导入模块换成qtpy这个通用库(支持pyside2-6,pyqt5-6),老版本的是Qt.py(支持pysi…

力扣Lc26--- 1108. IP 地址无效化(java版)-2024年4月02日

1.题目描述 2.知识点 注1:首先,在Java中,字符类型应该使用单引号’,而不是双引号"。其次,修改字符数组中的元素应该使用单引号。 注2:String类的replace方法用于在字符串中替换指定的字符或字符序列。…