[每周一更]-(第50期):Go的垃圾回收GC

在这里插入图片描述

参考文章:

  • https://juejin.cn/post/7111515970669117447
  • https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-garbage-collector/
  • https://colobu.com/2022/07/16/A-Guide-to-the-Go-Garbage-Collector/
  • https://liangyaopei.github.io/2021/01/02/golang-gc-intro/
  • https://xargin.com/impl-of-go-gc/
  • https://www.bookstack.cn/read/qcrao-Go-Questions/spilt.5.GC-GC.md

什么是GC?

Go语言的垃圾回收机制Garbage Collection,简称 GC

在传统编程语言中我们需要关注对象的分配位置,要自己去选择对象分配在堆还是栈上,
但在 Go 这门有 GC 的语言中,集成了逃逸分析功能,帮助我们自动判断对象应该在堆上还是栈上,可以使用 go build -gcflags="-m" 来观察逃逸分析的结果

GC的原理是什么?

Go语言的垃圾回收器采用了并发三色标记清除算法(Concurrent Tri-Color Mark-And-Sweep),(Stop-the-World,简称STW,指的是GC事件发生过程中,会产生应用程序的停顿。)尽可能减少STW(stop the world)时间,
以降低吞吐为代价换取低延迟,实现了高效的垃圾回收。
标记清除算法的基本原理是,垃圾回收器将所有的存活对象标记为“活”的,未被标记的对象则被认为是垃圾。经典的标记清除算法通常分为两个阶段:

  • 标记阶段:垃圾回收器从根对象开始,遍历所有可达对象,并将它们标记为“活”的。
  • 清除阶段:垃圾回收器从堆的起始地址开始遍历,将未被标记的对象清除,回收内存。

Go语言的垃圾回收器采用了三色标记法(Tri-Color Marking),将堆上的内存对象分为三种颜色

  • 白色:未被标记为“活”的对象,是潜在的垃圾,后续可能会被GC回收。
  • 灰色:待扫描的对象,当扫描某个灰色对象时,GC会将其标记为黑色,然后将该对象指向的所有对象都标记为灰色,待后续标记。
  • 黑色:被标记为“活”的对象,在这轮GC中不会被回收。

垃圾回收器开始工作时不存在黑色对象,垃圾回收器会将根对象标记为灰色,并从根对象(通常是栈对象和全局对象)开始遍历。垃圾回收器会将灰色对象标记为黑色,
并将该对象指向的对象标记为灰色。垃圾回收器重复这个过程,直到所有可达对象都被标记为黑色。最后,垃圾回收器清除所有未被标记为黑色的对象,即清除所有白色对象。

GC如何优化?

优化GC的开销是提高系统性能和响应速度的重要手段。

缩短STW时间

Go GC触发时机大体分为三种:

  • 手动触发:调用runtime.GC()
  • 常规触发:Target heap memory = Live heap + (Live heap + GC roots) * GOGC / 100
  • sysmon后台周期性强制触发GC
减少堆内存的分配和释放

GC开销大的根源在于heap object多,Go的每轮GC都是FullGC,每轮都要将所有heap object标记(mark)一遍,
即便大多数heap object都是长期alive的,因此,一个直观的降低GC开销的方法就是减少heap object的数量,即减少alloc。

  • 把小对象聚合到一个结构体中,然后做一次分配即可
  • 内存空间重用,如:sync.Pool

常见的GC

  • 引用计数法
    根据对象自身的引用计数来回收,当引用计数归零时进行回收,但是计数频繁更新会带来更多开销,且无法解决循环引用的问题。
    • 优点:简单直接,回收速度快
    • 缺点:需要额外的空间存放计数,无法处理循环引用的情况;
  • 标记清除法
    标记出所有不需要回收的对象,在标记完成后统一回收掉所有未被标记的对象。
    • 优点:简单直接,速度快,适合可回收对象不多的场景
    • 缺点:会造成不连续的内存空间(内存碎片),导致有大的对象创建的时候,明明内存中总内存是够的,但是空间不是连续的造成对象无法分配;
  • 复制法
    复制法将内存分为大小相同的两块,每次使用其中的一块,当这一块的内存使用完后,将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉
    • 优点:解决了内存碎片的问题,每次清除针对的都是整块内存,但是因为移动对象需要耗费时间,效率低于标记清除法;
    • 缺点:有部分内存总是利用不到,资源浪费,移动存活对象比较耗时,并且如果存活对象较多的时候,需要担保机制确保复制区有足够的空间可完成复制;
  • 标记整理
    标记过程同标记清除法,结束后将存活对象压缩至一端,然后清除边界外的内容
    • 优点:解决了内存碎片的问题,也不像标记复制法那样需要担保机制,存活对象较多的场景也使适用;
    • 缺点:性能低,因为在移动对象的时候不仅需要移动对象还要维护对象的引用地址,可能需要对内存经过几次扫描才能完成;
  • 分代式
    将对象根据存活时间的长短进行分类,存活时间小于某个值的为年轻代,存活时间大于某个值的为老年代,永远不会参与回收的对象为永久代。
    并根据分代假设(如果一个对象存活时间不长则倾向于被回收,如果一个对象已经存活很长时间则倾向于存活更长时间)对对象进行回收。

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

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

相关文章

2023年终总结(脚踏实地,仰望星空)

回忆录 2023年,经历非常多的大事情,找工作、实习、研究生毕业、堂哥结婚、大姐买车、申博、读博、参加马拉松,有幸这一年全家人平平安安,在稳步前进。算是折腾的一年,杭州、赣州、武汉、澳门、珠海、遵义来回跑。完成…

软件测试|SQL AND和OR运算符解析

简介 在SQL(Structured Query Language)中,AND和OR是两个常用的逻辑运算符。它们用于组合条件来构建复杂的查询语句,帮助我们更精确地过滤和检索数据。本文将详细介绍SQL中的AND和OR运算符,包括其语法、用法以及使用时…

nginx原理和配置项详解

一、nginx原理 Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。其工作原理和配置项如下: 工作原理: 反向代理:Nginx可以作为反向代理服务器,接收客户端的请求,然后将请求转…

企业级实践为“燃料”,大模型助推Kyligence产品力向上

回顾2023年,最火热的科技话题无疑是生成式AI。 从ChatGPT横空出世,到“千模大战”如火如荼,AIGC正式破圈,成为企业数字化转型的新关键词。 在红杉中国《2023企业数字化年度指南》中,通过调研235家企业可知&#xff0…

VR与数字孪生:共同构筑未来的虚拟世界

随着科技的不断发展,数字孪生和VR已经成为当今热门的科技话题。作为山海鲸可视化软件的开发者,我们对这两者都有深入的了解。在此,我们将详细探讨数字孪生与VR的区别和联系。 首先,数字孪生(Digital Twin)…

光明源@智慧厕所技术:优化生活,提升卫生舒适度

在当今数字科技飞速发展的时代,我们的日常生活正在经历一场革命,而这场革命的其中一个前沿领域就是智慧厕所技术。这项技术不仅仅是对传统卫生间的一次升级,更是对我们生活品质的全方位提升。从智能感应到数据分析,从环保设计到舒…

BFS、SPFA、Dijkstra算法中vis数组的用法对比

先上代码&#xff1a; BFS&#xff1a; bool vis[MAXN]; int dis[MAXN];void bfs(int s) {queue<int> Q;Q.push(s);vis[s] true;while(!Q.empty()){int u Q.front();Q.pop();for(int e first[u]; e; e nxt[e]){int v go[e];if(vis[v]) continue;dis[v] dis[u] 1…

防抖节流的应用场景

1.防抖&#xff1a; 表单验证&#xff1a;当用户在输入框中输入内容时&#xff0c;可以使用防抖来延迟验证用户输入的内容&#xff0c;减少验证的频率。按钮点击&#xff1a;当用户频繁点击按钮时&#xff0c;可以使用防抖来确保只有最后一次点击生效&#xff0c;避免重复提交…

python flask-富文本编辑器的嵌入

富文本编辑器是用来提交大段文字的有效途径&#xff0c;同时也比较美观一些。下面记录下最简用法。首先是pip pip install flask-ckeditor 安装完毕后&#xff0c;观察下面语句&#xff0c;先引入模块然后绑到app上最后就可以个调用了&#xff0c;最简单的取数据方法是&#xf…

外汇天眼:交易如何突破“知行合一”这关?

接触交易之后有无数次想要放弃交易&#xff0c;在交易中的失败实在是太痛苦了&#xff0c;有时候这种失败是打击的作为一个人的最根本的自信&#xff0c;这种失败让我质疑我自己“本就是个普通人&#xff0c;不要想太美的事情”“为什么学习这么多还是不能盈利&#xff0c;我真…

<六>Python的字符串切片及常见操作

字符串的表示 在Python里&#xff0c;可以使用一对单引号、一对双引号或者一对三个双引号、一对三个单引号表示字符串。 a "Im Tom" # 一对双引号 b Tom said:"I am Tom" # 一对单引号c Tom said:"I\m Tom" # 转义字符d Tom said:"…

行业模型与场景落地新样本,网易有道发布多款“子曰”教育大模型落地应用与产品

距离2023年7月正式发布教育大模型“子曰”不到半年时间&#xff0c;教育科技公司网易有道近日再次分享了“子曰”教育大模型创新和落地成果&#xff0c;宣布推出国内首个教育大模型“子曰”2.0版本&#xff0c;同时还发布了基于大模型研发的三大创新应用——AI家庭教师“小P老师…

11.19 校招 实习 内推 面经

绿*泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、自动驾驶一周资讯 - 理想汽车发布第三季度财报&#xff1b;小米汽车现身工信部公告&#xff1b;小鹏汽车Q3营收超85亿元&#xff1b;11月前两周新势力销量排行榜 自动驾驶一周资讯 - 理想…

第01章_C语言入门

第01章_C语言入门 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 适合对象 考研同学&#xff0c;且考试科目中包含数据结构等&#xff08;需要使用C/C写代码&#xff09;考研同学&#xff0c;考…

前端如何获取响应头Content-Disposition中的filename,获取文件类型fileType进行不同类型的文件预览

// 预览文件preview: function(item) {var vm = this;if (!item.raw) {var itemBasicId = this.form.itemBasicIdvar url =ctx + /aea/item/basic/getItemDocOrTemplateFile.do?itemBasicId=+itemBasicId+&fileType=applyTableTemplateaxios({method: GET,headers: {Autho…

简述C语言中为什么要用指针

在C语言中&#xff0c;指针的使用是非常重要的&#xff0c;主要由于以下几个原因&#xff1a; 直接访问内存&#xff1a;指针允许程序直接访问和操作内存。这使得程序能够与硬件直接交互&#xff0c;提供了对底层数据结构的更精细控制&#xff0c;这在系统编程中尤其重要。 提…

ChatGPT怎么帮我上班的

1.解放生产力 1&#xff09;标准格式&#xff0c;完美输出。GPT对于公文等具有一定标准格式的文件&#xff0c;可以进行完美仿写&#xff0c;随随便便以假乱真那都是小菜一碟&#xff0c;这对于经常要开展规范成文的人来说&#xff0c;简直就是个福音&#xff0c;只要前期调教…

ruoyi-ai 基于ruoyi-plus实现AI聊天和绘画功能-后端

基于ruoyi-plus实现AI聊天和绘画功能-后端 本项目完全开源免费&#xff01; 后台管理界面使用elementUI服务端使用Java17SpringBoot3.X ruoyi-ai: 基于ruoyi-plus实现AI聊天和绘画功能-后端 实现功能 集成OpenAi API (gpt-4-vision-preview dall-e-3)接入文生图模型&#xf…

如何快速定位php程序运行慢的地方

1 slow log日志 查看slowlog日志位置 编辑php-fpm.conf文件&#xff0c;更改或增加两行内容 slowlog /data/logs/php-slow.log request_slowlog_timeout 2 说明&#xff1a;slowlog定义日志路径和名字&#xff0c;request_slowlog_timeout定义超时时间&#xff0c;单位…

初探Linux环境配置与pyTorch学习

初探Linux环境配置与pyTorch学习 文章目录 初探Linux环境配置与pyTorch学习初探LinuxInstall vmware and ubuntuSwap sourses and typewritingLearn basic command Learn gitLearn .gitignore and git lfsgitignore忽略规则优先级忽略规则匹配语法实例不生效情况 git lfslfs作用…