广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >go语言有gc吗
  • 610
分享到

go语言有gc吗

Golanggo语言Go 2022-11-24 20:11:20 610人浏览 独家记忆
摘要

本教程操作环境:windows7系统、Go 1.18版本、Dell G3电脑。GC机制是在Java语言被广泛使用之后所火起来的,像后来的脚本语言python都支持GC,GO也支持GC。Go语言和C/C++语言的一个显著的特点是Go中对象内存

教程操作环境:windows7系统、Go 1.18版本、Dell G3电脑。

GC机制是在Java语言被广泛使用之后所火起来的,像后来的脚本语言python都支持GC,GO也支持GC。

Go语言和C/C++语言的一个显著的特点是Go中对象内存空间的回收是通过GC机制来完成的,不需要像c++一样通过程序员的手动申请和释放,所以Go中相对不容易出现内存泄漏。今天我们就来聊聊Go中的GC机制。

什么是GC,又有什么用?

GC,全称 Garbage Collection,即垃圾回收,是一种自动内存管理的机制。

当程序向操作系统申请的内存不再需要时,垃圾回收主动将其回收并供其他代码进行内存申请时候复用,或者将其归还给操作系统,这种针对内存级别资源的自动回收过程,即为垃圾回收。而负责垃圾回收的程序组件,即为垃圾回收器。

垃圾回收其实一个完美的 “Simplicity is Complicated” 的例子。一方面,程序员受益于 GC,无需操心、也不再需要对内存进行手动的申请和释放操作,GC 在程序运行时自动释放残留的内存。另一方面,GC 对程序员几乎不可见,仅在程序需要进行特殊优化时,通过提供可调控的 api,对 GC 的运行时机、运行开销进行把控的时候才得以现身。

通常,垃圾回收器的执行过程被划分为两个半独立的组件:

  • 赋值器(Mutator):这一名称本质上是在指代用户态的代码。因为对垃圾回收器而言,用户态的代码仅仅只是在修改对象之间的引用关系,也就是在对象图(对象之间引用关系的一个有向图)上进行操作。

  • 回收器(Collector):负责执行垃圾回收的代码。

GC中的根对象

根对象在垃圾回收的术语中又叫做根集合,它是垃圾回收器在标记过程时最先检查的对象,包括:

  • 全局变量:程序在编译期就能确定的那些存在于程序整个生命周期的变量。

  • 执行栈:每个 goroutine 都包含自己的执行栈,这些执行栈上包含栈上的变量及指向分配的堆内存区块的指针。

  • 寄存器:寄存器的值可能表示一个指针,参与计算的这些指针可能指向某些赋值器分配的堆内存区块。

GC的实现方式

所有的 GC 算法其存在形式可以归结为追踪(Tracing)和引用计数(Reference Counting)这两种形式的混合运用。

  • 追踪式 GC

    从根对象出发,根据对象之间的引用信息,一步步推进直到扫描完毕整个堆并确定需要保留的对象,从而回收所有可回收的对象。Go、 Java、V8 对 javascript 的实现等均为追踪式 GC。

  • 引用计数式 GC

    每个对象自身包含一个被引用的计数器,当计数器归零时自动得到回收。因为此方法缺陷较多,在追求高性能时通常不被应用。Python、Objective-C 等均为引用计数式 GC。

目前比较常见的 GC 实现方式包括:

  • 追踪式,分为多种不同类型,例如:

    • 标记清扫:从根对象出发,将确定存活的对象进行标记,并清扫可以回收的对象。

    • 标记整理:为了解决内存碎片问题而提出,在标记过程中,将对象尽可能整理到一块连续的内存上。

    • 增量式:将标记与清扫的过程分批执行,每次执行很小的部分,从而增量的推进垃圾回收,达到近似实时、几乎无停顿的目的。

    • 增量整理:在增量式的基础上,增加对对象的整理过程。

    • 分代式:将对象根据存活时间的长短进行分类,存活时间小于某个值的为年轻代,存活时间大于某个值的为老年代,永远不会参与回收的对象为永久代。并根据分代假设(如果一个对象存活时间不长则倾向于被回收,如果一个对象已经存活很长时间则倾向于存活更长时间)对对象进行回收。

  • 引用计数:根据对象自身的引用计数来回收,当引用计数归零时立即回收。

Go中GC的实现方式

对于 Go 而言,Go 的 GC 使用的是无分代(对象没有代际之分)、不整理(回收过程中不对对象进行移动与整理)、并发(与用户代码并发执行)的三色标记清扫算法。【相关推荐:Go视频教程】

原因如下:

  • 对象整理的优势是解决内存碎片问题以及“允许”使用顺序内存分配器。但 Go 运行时的分配算法基于 tcmalloc,基本上没有碎片问题。并且顺序内存分配器在多线程的场景下并不适用。Go 使用的是基于 tcmalloc 的现代内存分配算法,对对象进行整理不会带来实质性的性能提升。

  • 分代 GC 依赖分代假设,即 GC 将主要的回收目标放在新创建的对象上(存活时间短,更倾向于被回收),而非频繁检查所有对象。但 Go 的编译器会通过逃逸分析将大部分新生对象存储在栈上(栈直接被回收),只有那些需要长期存在的对象才会被分配到需要进行垃圾回收的堆中。也就是说,分代 GC 回收的那些存活时间短的对象在 Go 中是直接被分配到栈上,当 goroutine 死亡后栈也会被直接回收,不需要 GC 的参与,进而分代假设并没有带来直接优势。并且 Go 的垃圾回收器与用户代码并发执行,使得 STW 的时间与对象的代际、对象的 size 没有关系。Go 团队更关注于如何更好地让 GC 与用户代码并发执行(使用适当的 CPU 来执行垃圾回收),而非减少停顿时间这一单一目标上。

以上就是go语言有gc吗的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: go语言有gc吗

本文链接: https://www.lsjlt.com/news/173574.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go语言有gc吗
    本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。GC机制是在Java语言被广泛使用之后所火起来的,像后来的脚本语言Python都支持GC,GO也支持GC。Go语言和C/C++语言的一个显著的特点是Go中对象内存...
    99+
    2022-11-24
    Golang go语言 Go
  • go语言有没有gc
    这篇文章主要介绍“go语言有没有gc”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go语言有没有gc”文章能帮助大家解决问题。go语言有gc。GC是指垃圾回收,是一种自动内存管理的机制;go语言支持...
    99+
    2023-07-04
  • Go语言的GC流程解析
    这篇文章主要介绍“Go语言的GC流程解析”,在日常操作中,相信很多人在Go语言的GC流程解析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言的GC流程解析”的疑惑有所帮...
    99+
    2022-10-19
    go语言
  • go语言有while吗
    这篇“go语言有while吗”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言有while吗”文章吧。go语言中没有wh...
    99+
    2023-07-04
  • go语言有反射吗
    本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。Go语言提供了一种机制在运行时更新和检查变量的值、调用变量的方法和变量支持的内在操作,但是在编译时并不知道这些变量的具体类型,这种机制被称为反射。反射也可以让我们...
    99+
    2022-11-25
    Go Golang go语言
  • go语言有注解吗
    今天小编给大家分享一下go语言有注解吗的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。go语言没有注解。go语言不支持注解的原...
    99+
    2023-07-05
  • go语言有缩进吗
    这篇文章主要介绍“go语言有缩进吗”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go语言有缩进吗”文章能帮助大家解决问题。go语言有缩进。在go语言中,缩进直接使用gofmt工具格式化即可(gofm...
    99+
    2023-07-04
  • go语言是易语言吗
    go语言不是易语言,两者是不同的编程语言。go语言(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。易语言(EPL)是一门以中文作为程序代码编程语言,其以“易”著称,创始人为吴涛;易语言早...
    99+
    2023-05-14
    易语言 go语言 Golang
  • go语言有垃圾回收吗
    go语言有垃圾回收。Go语言自带垃圾回收机制(GC);GC通过独立的进程执行,它会搜索不再使用的变量,并将其释放。在计算中。内存空间包含两个重要的区域:栈区 (Stack) 和堆区 (Heap);栈区一般存储了函数调用的参数、返回值以及局部...
    99+
    2023-05-14
    垃圾回收 Go Golang go语言
  • go语言有指针运算吗
    本篇内容介绍了“go语言有指针运算吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!go语言没有指针运算。go语言的语法上是不支持指针运算的,...
    99+
    2023-07-04
  • go语言缩进有影响吗
    go语言缩进对程序运行效率没有影响,但却对程序的可读性、可维护性和代码质量有着重要的影响。因此,在编写Go语言代码时,我们应该遵守Go语言的缩进规范,保持代码的一致性和可读性,以提高代码质量和开发效率 。本教程操作环境:windows10系...
    99+
    2023-07-14
  • go语言和js有关联吗
    go语言和js有关联。比较明显的关联有:1、Web开发;2、前后端分离;3、交互性;4、编译到JavaScript。本教程操作环境:windows10系统、golang1.20.1版本、DELL G3电脑。Go语言和JavaScript(简...
    99+
    2023-07-14
  • go语言是编程语言吗
    本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型、并...
    99+
    2022-11-28
    Go Golang go语言
  • go语言是系统语言吗
    go语言是系统语言。Go语言是一门系统级语言,它为解决大型系统开发过程中的实际问题而设计,支持并发、规范统一、简单优雅,性能强大;它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C 等编译型语言的性能与安全性”。Go语言专门...
    99+
    2023-05-14
    Golang go语言
  • go语言是底层语言吗
    go语言不是底层语言,go语言被广泛认为是一种系统级编程语言,更接近于高级语言,而不是底层语言。底层语言通常是指与硬件直接交互的编程语言,它们提供了对计算机底层操作的精细控制,这些语言往往需要程序员手动管理内存、处理输入输出等底层细节,因此...
    99+
    2023-07-17
  • go语言是后端语言吗
    go语言是后端语言。go语言是服务端的编程语言,其方向主要是后端。使用Go语言做后端开发的原因:1、在语言层面具有语法简洁、执行效率高(底层语言)的特点;2、Go语言是主打并发、为并发而生的,其出发点即是瞄准大数据+云计算时代背景下的高并发...
    99+
    2023-05-14
    go语言
  • go语言是静态语言吗
    go语言是静态语言。GO是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。静态语言(强类型语言)是编译时变量的数据类型就可以确定的语言;而在Go语言中,变量就是有明确类型的,编译器也会检查变量类型的正确性,声...
    99+
    2023-05-14
    Golang go语言
  • go语言是机器语言吗
    go语言不是机器语言;机器语言是低级语言,而go语言是一种高级语言。Go语言是Google公司在2009年开源的一门高级编程语言,它为解决大型系统开发过程中的实际问题而设计,支持并发、规范统一、简单优雅,性能强大;它的主要目标是“兼具 Py...
    99+
    2023-05-14
    go语言 Golang
  • go语言是动态语言吗
    go不是动态语言。go语言是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,其变量(variable)是有明确类型的,编译器也会检查变量类型的正确性;因此在使用变量之前必须声明数据类型需要,语法“var 变量...
    99+
    2023-05-14
    动态语言 go语言 Golang
  • go语言开源吗
    go语言是开源。go语言于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后来追加了Windows系统下的实现;go语言采用的是BSD开源协议。BSD开源协议是一个给于使用者很大自由的协议...
    99+
    2023-05-14
    Go Golang go语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作