广告
返回顶部
首页 > 资讯 > 精选 >go语言需不需要手动管理内存
  • 614
分享到

go语言需不需要手动管理内存

2023-07-04 20:07:44 614人浏览 泡泡鱼
摘要

这篇文章主要介绍了Go语言需不需要手动管理内存的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言需不需要手动管理内存文章都会有所收获,下面我们一起来看看吧。go语言不需要手动管理内存;go语言内置内存管理功

这篇文章主要介绍了Go语言需不需要手动管理内存的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言需不需要手动管理内存文章都会有所收获,下面我们一起来看看吧。

go语言不需要手动管理内存;go语言内置内存管理功能(GC机制),是一种自动内存管理的机制。当程序向操作系统申请的内存不再需要时,垃圾回收主动将其回收并供其他代码进行内存申请时候复用,或者将其归还给操作系统,这种针对内存级别资源的自动回收过程,即为垃圾回收;而负责垃圾回收的程序组件,即为垃圾回收器。

go语言不需要手动管理内存;go语言内置内存管理功能(GC机制),开发者不需要关心内存的申请和释放,这样为使用者带来极大的便利。

什么是GC,又有什么用?

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

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

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

在计算中,内存空间包含两个重要的区域:栈区 (Stack) 和堆区 (Heap);栈区一般存储了函数调用的参数、返回值以及局部变量,不会产生内存碎片,由编译器管理,无需开发者管理;而堆区会产生内存碎片,在 Go 语言中堆区的对象由内存分配器分配并由垃圾收集器回收

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

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

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

GC中的根对象

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

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

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

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

垃圾回收

在 Go 语言中,垃圾回收器实现的算法是一个并发的三色标记和扫描收集器

垃回收器与 Go 程序同时运行,因此需要通过一种写屏障算法来检测内存中的潜在变化。启动写屏障的唯一条件是在短时间内停止程序,即 “Stop the World”

go语言需不需要手动管理内存

写屏障的目的是允许收集器在收集期间保持堆上的数据完整性

1.1 实现原理

Go 语言的垃圾收集可以分成清除终止、标记、标记终止和清除四个不同的阶段,其中两个阶段会产生 Stop The World (STW)

go语言需不需要手动管理内存

清除终止阶段

  • 暂停程序,所有的处理器在这时会进入安全点(Safe point)

  • 如果当前垃圾收集循环是强制触发的,我们还需要处理还未被清理的内存管理单元

标记阶段 (STW)

  • 将状态切换至 _GCmark、开启写屏障、用户程序协助(Mutator Assists)并将根对象入队

  • 恢复执行程序,标记进程和用于协助的用户程序会开始并发标记内存中的对象,写屏障会将被覆盖的指针和新指针都标记成灰色,而所有新创建的对象都会被直接标记成黑色

  • 开始扫描根对象,包括所有 Goroutine 的栈、全局对象以及不在堆中的运行时数据结构,扫描 Goroutine 栈期间会暂停当前处理器

  • 依次处理灰色队列中的对象,将对象标记成黑色并将它们指向的对象标记成灰色

  • 使用分布式的终止算法检查剩余的工作,发现标记阶段完成后进入标记终止阶段

标记终止阶段 (STW)

  • 暂停程序、将状态切换至 _GCmarktermination 并关闭辅助标记的用户程序

  • 清理处理器上的线程缓存

清理阶段

  • 将状态切换至 _GCoff 开始清理阶段,初始化清理状态并关闭写屏障

  • 恢复用户程序,所有新创建的对象会标记成白色

  • 后台并发清理所有的内存管理单元,当 Goroutine 申请新的内存管理单元时就会触发清理

1.2 三色标记法

三色标记算法将程序中的对象分成白色、黑色和灰色三类:

  • 白色对象 — 潜在的垃圾,其内存可能会被垃圾收集器回收

  • 黑色对象 — 活跃的对象,包括不存在任何引用外部指针的对象以及从根对象可达的对象

  • 灰色对象 — 活跃的对象,因为存在指向白色对象的外部指针,垃圾收集器会扫描这些对象的子对象

三色标记垃圾收集器的工作原理很简单,可以将其归纳成以下几个步骤:

  • 从灰色对象的集合中选择一个灰色对象并将其标记成黑色

  • 将黑色对象指向的所有对象都标记成灰色,保证该对象和被该对象引用的对象都不会被回收

  • 重复上述两个步骤直到对象图中不存在灰色对象

go语言需不需要手动管理内存

关于“go语言需不需要手动管理内存”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“go语言需不需要手动管理内存”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: go语言需不需要手动管理内存

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

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

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

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

下载Word文档
猜你喜欢
  • go语言需不需要手动管理内存
    这篇文章主要介绍了go语言需不需要手动管理内存的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言需不需要手动管理内存文章都会有所收获,下面我们一起来看看吧。go语言不需要手动管理内存;go语言内置内存管理功...
    99+
    2023-07-04
  • go语言需不需要分号
    这篇文章主要介绍了go语言需不需要分号的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言需不需要分号文章都会有所收获,下面我们一起来看看吧。Go语言不需要在语句或者声明的末尾添加分号,除非一行上有多条语句。...
    99+
    2023-07-04
  • go语言需不需要第三方库
    go语言需要第三方库,尽管go语言本身提供了很多强大的功能,但有的时候开发人员需要使用第三方库来完成特定的任务,第三方库通常提供一些go语言标准库中不包含的功能,并且经过了更广泛的测试和优化,以确保其质量和性能,第三方库的使用可以将开发时间...
    99+
    2023-07-17
  • GO语言自然语言处理API:你需要知道的一切
    自然语言处理(NLP)是人工智能领域的一个重要分支,它主要涉及计算机如何理解、处理和生成人类语言。NLP技术已经被广泛应用于自动翻译、文本分类、信息提取和语音识别等领域。随着人们对NLP技术的需求不断增加,现在有许多NLP API可供使用...
    99+
    2023-09-22
    自然语言处理 api http
  • GO语言自然语言处理API:你需要了解的技术原理
    随着人工智能技术的发展,自然语言处理(Natural Language Processing,NLP)成为了人工智能领域中的热门方向之一。而GO语言作为一种快速、简单、可靠的编程语言,其在自然语言处理领域中的应用也越来越广泛。本文将介绍G...
    99+
    2023-09-22
    自然语言处理 api http
  • 使用Go语言处理日志,你需要知道什么?
    日志是一个系统中必不可少的组成部分。它可以帮助我们了解系统的运行状况、排查问题和进行性能分析。在Go语言中,处理日志非常简单,并且有很多成熟的库可供使用。本文将介绍如何使用Go语言处理日志,并向您展示一些最佳实践。 一、什么是日志? 日志...
    99+
    2023-09-26
    大数据 日志 leetcode
  • 用Go语言存储数组,你需要了解哪些关键字?
    随着计算机科学的不断发展,数据结构和算法的重要性越来越受到人们的关注。而在数据结构中,数组是一种非常常见的数据类型,它可以轻松地存储和访问多个数据项。在Go语言中,数组也是一种非常常见的数据类型,它可以帮助我们更好地管理和处理数据。本文将介...
    99+
    2023-09-23
    关键字 存储 数组
  • go语言内存管理的方法有哪些
    Go语言内存管理的方法有以下几种:1. 垃圾回收(Garbage Collection):Go语言使用自动垃圾回收机制来管理内存。垃...
    99+
    2023-09-27
    go语言
  • 【C语言进阶】动态内存管理
    动态内存管理 1.为什么存在动态内存分配2.动态内存函数的介绍2.1malloc和free2.2calloc2.3realloc 3.常见的动态内存错误3.1 对NULL指针的解引用操作...
    99+
    2023-10-25
    c语言 开发语言 1024程序员节
  • C语言动态内存管理介绍
    目录前言:C 语言为内存的分配和管理提供了几个函数:1.malloc() 用法2.calloc() 用法3.realloc() 与 free() 用法前言: 简单记录一下,内存管理...
    99+
    2022-11-12
  • Go语言中内存管理逃逸分析详解
    目录1. 前言2. 逃逸策略3. 逃逸场景3.1 指针逃逸3.2 栈空间不足逃逸3.3 动态类型逃逸3.4 闭包引用对象逃逸4.逃逸总结5. 注意事项1. 前言 所谓的逃逸分析(Es...
    99+
    2023-03-15
    Go 内存管理逃逸分析 Go 内存管理逃逸 Go 内存管理
  • 存储和访问数组,Go语言中哪些关键字需要掌握?
    Go语言是一种现代化的编程语言,它被广泛应用于各种领域,包括网络编程、分布式系统、云计算等等。在Go语言中,数组是一种重要的数据类型,它可以用来存储一组相同类型的数据。本文将介绍在Go语言中存储和访问数组时需要掌握的关键字。 一、定义数组 ...
    99+
    2023-09-23
    关键字 存储 数组
  • C语言动态内存管理的实现
    目录1. 摘要2. 为什么存在动态内存管理3. 动态内存函数3.1 malloc3.2 free3.3 calloc3.4 realloc4. 常见的动态内存错误5. 几个经典笔试题...
    99+
    2022-11-12
  • 详解C语言之动态内存管理
    目录开辟动态内存的函数释放开辟的动态内存空间的函数错误信息函数具体使用例: 常见的动态内存错误总结先来了解一下动态管理内存所需用到的函数 开辟动态内存的函数 1.mallo...
    99+
    2022-11-12
  • GO语言教程:从入门到精通,你需要了解的所有内容!
    Go语言是一种由Google开发的开源编程语言,它旨在提高程序员的生产力和可维护性。它具有强大的并发性能、垃圾回收机制和快速的编译速度。它是一种静态类型的编程语言,具有类似C语言的语法结构,同时还具有一些现代化的特性,如垃圾回收和类型推断...
    99+
    2023-06-28
    学习笔记 教程 开发技术
  • LeetCode上的自然语言处理题目,有哪些需要用到Go语言的解法?
    LeetCode是一个很好的学习和练习算法的平台,其中也有很多自然语言处理的题目。这些题目要求我们使用代码来解决自然语言处理中的各种问题。而在这些题目中,使用Go语言来解决问题也是一个不错的选择。本文将介绍一些LeetCode上的自然语言处...
    99+
    2023-09-08
    响应 自然语言处理 leetcode
  • 用 Go 语言构建分布式缓存,你需要知道哪些关键点?
    随着互联网业务的不断增长,数据量也在快速增加。为了提高系统的性能和响应速度,缓存成为了一个非常重要的组件。而分布式缓存则成为了大型互联网公司必不可少的基础设施之一。本文将介绍使用 Go 语言构建分布式缓存时需要考虑的关键点,并提供相应的演示...
    99+
    2023-09-03
    分布式 缓存 numpy
  • GO语言编程中的文件存储算法:您需要知道的一切
    在GO语言编程中,文件存储算法是一个非常重要的话题。在本文中,我们将探讨一些常见的文件存储算法,并为您提供一些演示代码。 哈希表 哈希表是一种常见的文件存储算法。它通过使用一个哈希函数将键映射到索引位置,然后在该位置存储值。在GO语言...
    99+
    2023-08-06
    编程算法 文件 存储
  • 提升Go语言内存管理的效率与性能
    要提升Go语言内存管理的效率与性能,可以考虑以下几个方面:1. 使用内存池:Go语言提供了sync.Pool类型,可以用于创建对象池...
    99+
    2023-10-08
    Golang
  • 如何解决Go语言中的内存管理问题?
    如何解决Go语言中的内存管理问题?在Go语言中,内存管理是一个重要的话题。由于Go语言自带的垃圾回收器(Garbage Collector)的存在,开发者不需要手动管理内存分配和释放,但这并不意味着我们可以完全忽视内存管理的问题。不合理的内...
    99+
    2023-10-22
    解决方案 Go语言 内存管理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作