golang学习笔记12——Go 语言内存管理详解

news/2024/10/11 16:26:34/文章来源:https://blog.csdn.net/woaijssss/article/details/142036071
  • 推荐学习文档
    • golang应用级os框架,欢迎star
    • 基于golang开发的一款超有个性的旅游计划app经历
    • golang实战大纲
    • golang优秀开发常用开源库汇总
    • golang学习笔记01——基本数据类型
    • golang学习笔记02——gin框架及基本原理
    • golang学习笔记03——gin框架的核心数据结构
    • golang学习笔记04——如何真正写好Golang代码?
    • golang学习笔记05——golang协程池,怎么实现协程池?
    • golang学习笔记06——怎么实现本地文件及目录监控-fsnotify
    • golang学习笔记07——使用gzip压缩字符减少redis等存储占用的实现
    • golang学习笔记08——如何调用阿里oss sdk实现访问对象存储?
    • golang学习笔记09——golang优秀开发常用开源库汇总
    • golang学习笔记10——golang 的 Gin 框架,快速构建高效 Web 应用
    • golang学习笔记11——Go 语言的并发与同步实现详解

文章目录

    • 引言
    • Go 语言内存分配
      • 1.栈和堆
      • 2.内存分配器
      • 3.代码示例
    • Go 语言垃圾回收
      • 1.垃圾回收机制
      • 2.垃圾回收触发时机
      • 3.代码示例
    • Go 语言内存优化
      • 1.减少内存分配
      • 2.内存复用
      • 3.代码示例
    • 总结

引言

在软件开发中,内存管理是一个至关重要的问题。高效的内存管理可以提高程序的性能、减少内存泄漏和提高程序的稳定性。Go 语言作为一种现代编程语言,拥有一套先进的内存管理机制。本文将详细介绍 Go 语言的内存管理问题,包括内存分配、垃圾回收和内存优化等方面,并结合代码示例进行深入讲解。

Go 语言内存分配

1.栈和堆

  • 在 Go 语言中,内存被分为栈和堆两部分。栈用于存储局部变量和函数调用信息,而堆用于存储动态分配的内存。
  • 当一个函数被调用时,它的参数和局部变量会被分配在栈上。当函数返回时,这些变量会被自动释放。
  • 对于需要在函数调用之间保持存在的变量,或者动态分配的内存,会被分配在堆上。

2.内存分配器

  • Go 语言使用了一个高效的内存分配器来管理内存。这个分配器会根据对象的大小和生命周期选择合适的内存区域进行分配。
  • 对于小对象,分配器会尝试在栈上进行分配。如果栈上的空间不足,或者对象的生命周期较长,分配器会将对象分配在堆上。
  • 分配器还会对内存进行对齐,以提高内存访问的效率。

3.代码示例

package mainimport "fmt"func main() {// 局部变量分配在栈上var a int = 10fmt.Println(a)// 动态分配的内存分配在堆上b := new(int)*b = 20fmt.Println(*b)
}

在上面的代码中,局部变量 a 会被分配在栈上,而通过 new 函数分配的内存 b 会被分配在堆上。

Go 语言垃圾回收

1.垃圾回收机制

  • Go 语言拥有一个自动的垃圾回收机制,可以自动回收不再使用的内存。
  • 垃圾回收器会定期扫描内存,标记哪些对象是可达的(即正在被使用的),哪些对象是不可达的(即不再被使用的)。不可达的对象会被回收,释放它们占用的内存。
  • Go 语言的垃圾回收器采用了三色标记法和写屏障技术,以提高垃圾回收的效率和准确性。

2.垃圾回收触发时机

  • Go 语言的垃圾回收器会在以下情况下触发:
    • 堆内存的使用量达到一定阈值。
    • 一定时间间隔内没有进行垃圾回收。
    • 手动触发垃圾回收(通过调用 runtime.GC() 函数)。

3.代码示例

package mainimport ("runtime""time"
)func main() {// 分配一些内存data := make([]int, 1000000)for i := range data {data[i] = i}// 手动触发垃圾回收runtime.GC()// 等待一段时间,让垃圾回收器有时间运行time.Sleep(time.Second)
}

在上面的代码中,首先分配了一个包含 1000000 个整数的切片,占用了一定的内存。然后手动触发了垃圾回收,最后等待一段时间,让垃圾回收器有时间运行。

Go 语言内存优化

1.减少内存分配

  • 在 Go 语言中,可以通过一些方法来减少内存分配,提高程序的性能。例如:
    • 尽量避免频繁地创建和销毁对象,可以重复使用对象或者使用对象池。
    • 对于小对象,可以考虑使用栈分配而不是堆分配。
    • 避免使用过大的切片或映射,尽量根据实际需求分配合适的大小。

2.内存复用

  • Go 语言中的一些数据结构,如切片和映射,可以进行内存复用。例如,可以使用 append 函数向切片中添加元素,而不是每次都创建一个新的切片。
  • 对于映射,可以使用 sync.Pool 来复用已经分配的内存,减少内存分配的次数。

3.代码示例

package mainimport ("sync"
)var pool = sync.Pool{New: func() interface{} {return make([]int, 0, 10)},
}func main() {// 从对象池中获取一个切片slice := pool.Get().([]int)defer pool.Put(slice)// 向切片中添加元素slice = append(slice, 1, 2, 3)fmt.Println(slice)
}

在上面的代码中,使用了 sync.Pool 来复用已经分配的内存。首先定义了一个对象池,当需要一个切片时,可以从对象池中获取一个已经分配好的切片。使用完毕后,将切片放回对象池中,以便下次复用。

总结

Go 语言的内存管理机制使得开发者可以更加专注于业务逻辑的实现,而不必过多地关注内存管理的细节。通过合理地使用内存分配、垃圾回收和内存优化技术,可以提高程序的性能、减少内存泄漏和提高程序的稳定性。在实际开发中,开发者应该根据具体的需求选择合适的内存管理策略,以实现高效、可靠的程序。

关注我看更多有意思的文章哦!👉👉

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

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

相关文章

智能优化算法-樽海鞘优化算法(SSA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 樽海鞘优化算法 (Salp Swarm Algorithm, SSA) 虽然名称中提到的是“樽海鞘”,但实际上这个算法是基于群体智能的一种元启发式优化算法,它模拟了樽海鞘(Salps)在海…

基于Python的电影推荐系统设计与实现---附源码80129

摘要 本项目旨在基于Python设计和实现一个电影推荐系统,旨在为用户提供个性化的电影推荐服务。通过分析用户的观影历史、评分和偏好等数据,系统将利用推荐算法为用户推荐符合其口味的电影。该系统将结合Python编程语言和数据分析技术,实现智能…

RISC-V架构下 DSA - AI算力的更多可能性:Banana Pi BPI-F3 进迭时空

AI已经从技术走向应用,改变了我们的生活和工作方式。近些年,AI算力芯片领域群雄逐鹿,通过对芯片、算力与AI三者发展迭代过程的理解,我们发现高能效比的算力、通用的软件栈以及高度优化的编译器,是我们的AI算力产品迈向…

【Linux实践】实验一:Linux系统安装与启动

【Linux实践】实验一:Linux系统安装与启动 实验目的实验内容实验步骤及结果1. 下载VMware2. 下载 Linux 操作系统3. 在VMware中安装Ubuntu系统4. 配置Ubuntu系统5. 关机 实验目的 1.掌握Linux系统的安装过程和简单配置方法。 2.掌握与Linux相关的多操作系统的安装方…

农产品管理与推荐系统Python+Django网页界面+计算机毕设项目+推荐算法

一、介绍 农产品管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的…

The First项目报告:BlackCardCoin让数字资产多元化

现有的区块链技术存在吞吐量瓶颈、互操作性有限和次优共识机制等问题,导致效率低下,阻碍了真正全球化金融体系的建立。因此,迫切需要一种创新的区块链,能够容纳现代金融的复杂性,包括即时结算、强大的安全措施&#xf…

李沐关于大模型应用及职业发展的分享

前几天看了 李沐 在上海交大做的一个 分享 , 主要分享了他对于大模型的一些看法和他个人的经历。 我很喜欢李沐,技术厉害,看起来比较接地气,录制的 课程 也比较容易看懂。 大模型的应用 下面这张图是他对当前大模型应用的看法。…

使用lspci命令获取加速卡型号

文章目录 前言一、lspci -nn 获取具体厂商及设备ID二、使用步骤三、使用3080Ti再查询一下 前言 新到的实验机器和加速卡,安装好之后发现lspci命令没有显示型号,这里记录下使用 Vendor ID和Device ID 通过网页查询获取加速卡具体型号的过程。 一、lspci …

PHP宠物爱好者交流网站-计算机毕业设计源码65481

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 注册流程 2.2.1 登录流程 2.2.3 数据删除流程 2.3 系统功能分析 2.4 系统用例分析 3 系统总体设计 3.1 系统架构设计 3.2 系统功能模块设…

【网易低代码】第1课,低代码带分页的增删改查我只要10秒完成

你好! 这是一个新课程 CodeWave网易低代码 通过自然语言交互式智能编程,同时利用机器学 习,帮助低代码开发者进一步降低使用门槛、提高应用开发效率 【网易低代码】第1课,页面表格添加数据功能 1.创建表格数据模型,添加…

【MySQL】数据库的操作【字符集和校验规则】【对数据库进行操作】【数据库备份与恢复】

目录 库的操作1.创建数据库2.字符集和校验规则2.1 查看系统默认字符集以及校验规则2.2查看支持的字符集2.3查看支持的字符集校验规则2.4 校验规则对数据库的影响 3.对数据库进行操作3.1查看数据库3.2显示数据库3.3修改数据库3.4删除数据库3.5备份与恢复(重要)3.5.1注意事项 3.6…

《C++》解密--算法复杂度

要正式开通C博客之路啦!! 一、数据结构 1、数据结构定义 数据结构 是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元 素的集合。 2、算法定义 算法 就是定义良好的计算过程,他取一个或一组的值为…

[含视频和源码]CRUD的最佳实践,联动前后端,包含微信小程序,API,HTML等(三)

关说不练假把式,在上一,二篇中介绍了我心目中的CRUD的样子 基于之前的理念,我开发了一个命名为PasteTemplate的项目,这个项目呢后续会转化成项目模板,转化成项目模板后,后续需要开发新的项目就可以基于这…

启动程序时遇到0xc000007b应用程序无法正常启动问题

启动程序时遇到0xc000007b应用程序无法正常启动问题 参考链接: 1、https://www.bilibili.com/read/cv16283667/ 一、问题描述: 启动程序时遇到0xc000007b应用程序无法正常启动问题,问题截图如下: 二、问题原因:错误…

discuz论坛3.4 截图粘贴图片发帖后显示不正常问题

处理方法 source\function 路径下修改function_discuzcode.php function bbcodeurl($url, $tags) 函数 if(!in_array(strtolower(substr($url, 0, 6)), array(http:/, https:, ftp://, rtsp:/, mms://,data:i) 这一句里增加 data:i 即可 function bbcodeurl($url,…

元学习之模型诊断元学习(model-agnosticmeta-learning,MAML)

模型诊断元学习(model-agnosticmeta-learning,MAML), 另一个是Reptile。这两个算法都是在 2017 年提出来的,而且都是基于梯度下降法进行优化 的。那我们最常用的学习算法是梯度下降,在梯度下降中&#xff0…

HarmonyOS NEXT 应用运行异常记录与解决(持续整理版)

问题1 App Launch Failed to get the device apiVersion. 解决方案 进入到设备管理,点击对应开启的模拟器设备,先将模拟器关闭,然后点击查出掉用户数据,再重启。 重启之后,一般能解决。如果遇到还是显示拿不到apiVers…

Rancher 与 Kubernetes(K8s)的关系

1. 简介 1.1 Kubernetes 作为容器编排平台 Kubernetes 是一个开源平台,用于自动化部署、扩展和管理容器化的应用。它提供了容器调度、自动伸缩、健康检查、滚动更新等功能。 例子:假设您有一个微服务架构的应用程序,需要运行在多个节…

Qt-QWidget的focusPolicy属性(20)

目录 描述 相关API 使用 描述 这里引入了焦点的概念,这个很重要,也是伴随后面介绍中的一个很重要的概念 拿魔兽世界来举例,如下我们在操作兵种的时候,需要先选中单位,然后才能对这些单位进行命令的下达 这一点在笔…

git修改提交名字

大家在使用git的时候,有的时候可能不是使用自己的账号,或者说账号的信息不符合自己的预期,具体表现在什么地方呢?在提交代码的时候,名字不是自己的,或者是名字不是自己想要的。 下面就是如何查看和修改。 …