Go语言内存管理详解 | 青训营笔记

91 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第6天

一、重点内容:

  • 本次主要学习了四个方面:自动内存管理、Go内存管理及优化、编译器和静态分析以及Go编译器优化。

二、详细知识点介绍:

  1. 自动内存管理
  • 自动内存管理是由程序语言的运行时系统管理动态内存。它可以帮助避免手动内存管理,专注于实现业务逻辑,并确保正确性和安全性。
  • 自动内存管理的任务是为新对象分配空间、确保存活对象、回收死亡对象的空间。
  • 追踪垃圾回收
    • 标记根对象,并根据标记找到所有对象,在需要回收的时候清理对象。
    • coping GC:将存活对象从一块空间复制到另一块,原先的空间可以直接进行对象分配。
    • Mark-sweep GC: 将死亡对象所在内存块标记为可分配,使用 free list 管理可分配的空间。
    • Mark-compact GC: 将存活对象复制到同一块内存区域的开头。
  • 引用计数
    • 每个存活对象都有一个与之关联的引用计数。
    • 当且仅当引用计数大于0时,对象存活。
  1. Go内存管理及优化
  • 内存管理的目标时为对象在heap上分配内存。

  • 内存管理的过程

    • 调用系统调用 mmap() 向 OS 申请一大块内存,例如 4 MB。
    • 先将内存划分成大块,例如 8 KB,称作 mspan。
    • 再将大块继续划分成特定大小的小块,用于对象分配。
    • noscan mspan: 分配不包含指针的对象 —— GC 不需要扫描
    • scan mspan: 分配包含指针的对象 —— GC 需要扫描
  • 内存管理应当根据业务的实际需求去优化。不同场景下的内存分配方式会造成不同的分配效率。

  1. 编译器和静态分析
  • 编译器结构如图所示:

image.png

  • 静态分析就是不执行代码,仅进行程序推导。
  • 控制流时程序的执行流程。
  • 数据流是数据在控制流上的传递。
  1. Go编译器优化
  • 目的是在用户不会感知到的状态下,通过优化就可以获得性能收益。可以适当增加编译时间,减少运行时时间。
  • 方式有函数内联、逃逸分析、语义分析等。
  • 该部分内容涉及较深,博主水平不足,具体可自行查阅相关资料,这里不再赘述。

三、实践练习例子:

  • 本次课程暂无实践练习代码。

四、课后个人总结:

  • 该课程将Go语言进行了进一步地深入,对于小白来说可能相对不是那么友好。但是经过了几天的学习和训练,这门课对我来说还是大有益处的。

  • 不得不再一次感叹,课上两小时,课后两星期啊!继续加油,课程满满的都是干货。