Go内存与编译优化 | 青训营笔记

76 阅读3分钟

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

今天我学习了Go基础课的九十节,两个视频时长合计大约为90分钟,其中我收获到许多内存管理与编译优化方面的知识,令我受益匪浅。

一、本堂课重点内容:

  • 本堂课的知识要点有哪些?
  1. 自动内存管理
  2. Go 内存管理及优化
  3. 编译器和静态分析
  4. Go 编译器优化

二、详细知识点介绍:

  • 本堂课介绍了哪些知识点?

自动内存管理,是由程序语言的运行时系统管理动态内存 自动的机制有常用的两种:追踪垃圾回收、引用计数 我们需要保证内存使用的正确性安全性,常见的方法是:double-free problem, use-after-free problem

编译优化,是要通过编译得到性能收益。 一般可以用内联函数、逃逸分析等的办法,来转换成执行效率更高的代码。

三、实践练习例子:

  • 有什么实践举例帮助理解知识点?
    这里需要感谢掘金团队学习课件中所提到的字节的优化方案,具体的一个实行的优化方案,让我从空洞的概念上升到了认知的层面,这极大地方便了我对编译优化的理解:juejin.cn/post/718952…

四、课后个人总结:

  • 本章有什么知识点不容易掌握?
    Go 是如何管理和组织内存的? Go在程序启动的时候,会先向操作系统申请一块内存(注意这时还只是一段虚拟的地址空间,并不会真正地分配内存),切成小块后自己进行管理。申请到的内存块被分配了三个区域,在X64上分别是512MB,16GB,512GB大小 Go语言的内存分配非常复杂,它的一个原则就是能复用的一定要复用。
  • Go在程序启动时,会向操作系统申请一大块内存,之后自行管理。
  • Go内存管理的基本单元是mspan,它由若干个页组成,每种mspan可以分配特定大小的object。
  • mcache, mcentral, mheap是Go内存管理的三大组件,层层递进。mcache管理线程在本地缓存的mspan;mcentral管理全局的mspan供所有线程使用;mheap管理Go的所有动态分配内存。
  • 极小对象会分配在一个object中,以节省资源,使用tiny分配器分配内存;一般小对象通过mspan分配内存;大对象则直接由mheap分配内存。

五、引用参考:

  • 我参考了哪些外部博客/笔记/文章?
    我参考了掘金内部课中的Go基础课程,也就是此次掘金内部课程:
    juejin.cn/course/byte… 另外还参考了Foxtail-Grass Studio的专辑封面,作为此次笔记的封面
  • 文章中有什么地方是我参考引用了外部博客/笔记/文章的?
    主要是课程的主要知识点总结,采用了一边阅读课件一边记录的方式进行了个人的一些学习总结。