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

68 阅读3分钟

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

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

今天主要对Go语言内存管理进行学习。

一、本堂课重点内容:

  • 本次课程讲了以下几个方面:

    1. 自动内存管理
    2. Go 内存管理及优化
    3. 编译器和静态分析
    4. Go编译器优化

二、详细知识点介绍:

1.自动内存管理

自动内存管理又称为垃圾回收(Garbage Collection,GC),GC是在程序运行时系统动态管理内存。可以让程序编写人员避免手动管理内存,更好的去专注于实现代码的具体业务逻辑,同时还可以保证内存使用的正确性和安全性。对内存进行管理的任务主要是为新对象分配空间、找到存活的对象、回收死亡对象的内存空间。

我们可以从安全性、吞吐率、暂停时间和内存开销等几个方面来评价GC算法。常见的GC算法有:追踪垃圾回收算法、引用计数算法。

2.Go内存管理及优化

我们可以将Go的内存分配划分成分块缓存两种方案。在分块方案中,我们需要提前将系统内存分块,然后根据对象的大小,选择最合适的块返回。在缓存方案中,Go语言使用GMP策略,在每一个P中都会有一个mcache用于快速分配对象,而在每个mcache中都管理一组mspan,如果mcache中的mspan分配完毕,会向mcentral申请未分配块的mspan。当mspan中没有分配的对象时,会被缓存在mcentral中,以供mcache申请使用。在字节里使用Go语言的优化方案为:Balanced GC

3.编译器和静态分析

编译器是用于识别语法是否合法的程序,同时还可以生成正确且高效的代码。编译器主要由分析部分(前端)和综合部分(后端)组成,如下图: image.png

在分析部分又细分为静态分析(不执行程序代码)、过程内分析(仅在函数内部进行分析)和过程间分析(考虑数据流和控制流)。

4.Go编译器优化

目前的编译器优化少、编译时间短,没有进行复杂的代码分析和优化。我们可以从面向后端长期执行任务和用编译时间更高效的机器码2个方向来对编译器进行优化。使用函数内联(lnlining)可以消除函数调用的开销,将过程间分析转化为过程内分析。在Go函数中内联受到很多限制,使用Beast Mode可以调整函数内联的策略,使得更多的函数被内联。

三、课后总结:

通过学习Go语言内存管理的课程内容,更加深入的了解了Go语言对于内存的管理策略和优化方案,同时领悟了对程序进行性能优化的目是提升用户的体验、降低成本以及提升系统资源的使用效率。

今天是除夕,马上就到新的一年了,提前祝小伙伴们新年快乐吖~