go语言的垃圾回收

这篇具有很好参考价值的文章主要介绍了go语言的垃圾回收。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

go语言的垃圾回收
垃圾回收就是对程序中不再使用的内存资源进行自动回收的操作
常见的垃圾回收算法:
引用计数:每个对象都维护一个引用计数,当被引用对象创建或者被赋值给其他对象时引用计数自动加1,如果对象被销毁,则计数-1,当计数为0时,回收该对象
优点:对象可以很快被回收,不会出现内存耗尽或者达到阀值才回收
缺点:不能很好的处理循环引用
标记-清除:从根变量开始遍历所有引用的对象,引用的对象标记“被引用,没有被标记的则进行回收。
优点:解决了引用计数的缺点
缺点:需要stw,暂时停止了程序运行
分代收集:按照对象生命周期长短划分不同的代空间,生命周期长的放入老年代,短的放入新生代,不同代有不同的回收算法和回收频率
优点:回收性能好
缺点:回收算法复杂
三色标记法:
初始状态下所有对象都是白色的
从根节点开始遍历所有对象,把遍历到的对象变成灰色对象
遍历灰色对象,将灰色对象引用的对象也变成灰色对象,然后将遍历过得灰色对象变成黑色对象
循环步骤3,直到灰色对象全部变成黑色
通过写屏障检测对象有变化,重复以上操作
收集所有白色对象(垃圾)
STW
为了避免GC过程中,对象之间的引用关系发生新的变更,使得GC的结果发生错误(如GC过程中新增了一个引用。但是由于未扫描到该引用导致将被引用的对象清除了),停止所有正在运行的协程
STW对性能有一些影响,Golang目前已经可以做到1ms以下的STW
写屏障
为了避免GC的过程中新修改的引用关系到GC的结果发生错误,我们需要进行STW。但是STW会影响程序的性能,所以我们要通过写屏障技术尽可能的缩短STW的时间
造成引用对象丢失的条件:
一个黑色的节点A新增了指向白色节点C的 引用,并且白色节点c没有除了A之外的其他灰色节点的引用,或者存在但是在GC过程中被删除了。
以上两个条件需要同时满足:满足条件1时说明节点A已扫描完毕,A指向C的引用无法再被扫描到
满足条件2时说明白色节点C无其他灰色节点的引用了,即扫描结束后会被忽略
写屏障破坏两个条件其一即可
破坏条件1:Dijistra写屏障
满足强三色不变形:黑色节点不允许引用白色节点 当黑色节点新增了白色节点的引用时,将对应的白色节点改为灰色
破坏条件2:Yuasa写屏障
满足弱三色不变性:黑色节点允许引用白色节点,但是该白色节点有其他的灰色节点间接的引用(确保不会被遗漏)当白色节点被删除了一个引用时,悲观的认为它一定会被一个黑色节点新增引用,所以将它置为灰色

作为求职者,当面试官问到垃圾回收时,我会回答如下:

垃圾回收是一种自动内存管理技术,用于检测和回收不再使用的内存资源,以避免内存泄漏和内存溢出问题。常见的垃圾回收算法包括标记-清除算法、复制算法和标记-整理算法。

在Golang中,垃圾回收是由Go语言运行时系统(runtime)负责管理的。Golang的垃圾回收器使用了并发标记清除算法,即在程序运行过程中,垃圾回收器会标记所有活跃对象,并清除未被引用的对象。这个过程会通过并发执行来减少对应用程序的影响。

Golang的垃圾回收器有多个阶段,包括标记阶段、清除阶段和压缩阶段。标记阶段会从根对象开始,递归遍历所有可达对象,并标记为活跃对象。清除阶段会释放未被标记的内存空间。压缩阶段则会对内存进行整理,减少碎片化。

为了优化垃圾回收的性能,我们可以在代码层面上做一些优化。例如,尽量减少对象的创建和销毁,避免产生过多的临时对象;避免循环引用,以免形成无法回收的对象;合理设置垃圾回收的阈值参数,以平衡内存使用和性能。

在实际项目中,我也积累了一些经验。例如,通过分析内存使用情况,设置合适的垃圾回收参数,以满足应用程序的性能需求;在关键路径上尽量避免频繁的垃圾回收,可以通过对象复用等方式来减少垃圾回收的开销。

总结起来,垃圾回收是一种重要的内存管理技术,在Golang中有着高效、可预测性和适应性的优点。通过合理的代码编写和参数设置,可以优化垃圾回收的性能,提高应用程序的运行效率。文章来源地址https://www.toymoban.com/news/detail-818844.html

到了这里,关于go语言的垃圾回收的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM——垃圾回收(垃圾回收算法+分代垃圾回收+垃圾回收器)

    只要一个对象被其他对象所引用,就要让该对象的技术加1,某个对象不再引用其,则让它计数减1。当计数变为0时就可以作为垃圾被回收。 有一个弊端叫做循环引用,两个的引用计数都是1,导致不能作为垃圾回收,会造成内存泄露。 java虚拟机没有采用该算法。 该算法需要

    2024年02月12日
    浏览(50)
  • Golang:Go语言结构

    在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 表达式 注释 接下来让我们来看下简单的代码,该代码输出了\\\"Hello World!\\\": 让我们来看下以上程序的各个部分: 第一

    2024年02月10日
    浏览(59)
  • 垃圾回收 - 分代垃圾回收

    分代垃圾回收在对象中导入了“年龄”的概念,通过优先回收容易成为垃圾的对象,提高垃圾回收的效率。 分代垃圾回收中把对象分类成几代,针对不同的代使用不同的 GC 算法,我们把刚生成的对象称为新生代对象,到达一定年龄的对象则称为老年代对象。 众所周知,新生

    2024年02月08日
    浏览(37)
  • 【GoLang】MAC安装Go语言环境

    小试牛刀 首先安装VScode软件 或者pycharm mac安装brew软件  brew install go 报了一个错误 不提供这个支持  重新brew install go 之后又重新brew reinstall go 使用go version 可以看到go 的版本 使用go env  可以看到go安装后的配置 配置一个环境变量 vim ~/.zshrc,  

    2024年02月15日
    浏览(60)
  • Go语言(Golang)数据库编程

    要想连接到 SQL 数据库,首先需要加载目标数据库的驱动,驱动里面包含着于该数据库交互的逻辑。 sql.Open() 数据库驱动的名称 数据源名称 得到一个指向 sql.DB 这个 struct 的指针 sql.DB 是用来操作数据库的,它代表了0个或者多个底层连接的池,这些连接由sql 包来维护,sql 包会

    2024年02月03日
    浏览(93)
  • 【Golang】VScode配置Go语言环境

    安装VScode请参考我的上一篇博客:VScode安装_㫪548的博客-CSDN博客 接下来我们直接进入正题: Go语言(又称Golang)是一种开源的编程语言,由Google开发并于2009年首次发布。Go语言具有简洁、高效、可靠和易于阅读的特点,被设计用于解决大型项目的开发需求。它结合了静态类型

    2024年02月03日
    浏览(66)
  • 【Golang】Golang进阶系列教程--Go 语言 map 如何顺序读取?

    Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。 然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。 先看一段代码示例: 当我们多执行几次这段代码时,就会发现,输出的顺序是不同的。 首先,Go 语言

    2024年02月14日
    浏览(69)
  • 【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

    在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 数组和切片是两个常用的数据结构。它们都可以用于存储一组相同类型的元素,但在底层实现和使用方式上存在一些重要的区别。 Go 中数组的长度是不可改变的

    2024年02月15日
    浏览(61)
  • 【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

    在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义如下: 指针: 指向

    2024年02月14日
    浏览(70)
  • JVM7:垃圾回收是什么?从运行时数据区看垃圾回收到底回收哪块区域?垃圾回收如何去回收?垃圾回收策略,引用计数算法及循环引用问题,可达性分析算法

    在Java中,垃圾回收(Garbage Collection,简称GC),是自动管理内存的机制。它负责检测不再使用的对象,并释放它们所占用的内存,以供其他对象使用。 JVM内存模型认识的差不多了,就应该思考,什么样的内存模型适合什么样的GC策略,包括垃圾回收为什么会出现。实际上,很多

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包