这是我参与「第五届青训营」伴学笔记创作活动的第4天
本节课主要讲述了关于Go语言内存管理详解,课程包括四个方面:
自动化内存管理
Go内存管理及优化
编译器和静态分析
Go编译器优化
Go内存管理及优化
逃逸分析
Go 可以自动的管理内存,这帮我们避免了大量潜在 bug,但它并没有将程序员彻底的从内存分配的事情上解脱出来。因为 Go 没有提供直接操作内存的方式,所以开发者必须要搞懂其内部机制,这样才能将收益最大化。
Go 有两个地方可以分配内存:一个全局堆空间用来动态分配内存,另一个是每个 goroutine 都有的自身栈空间。 Go 更倾向于在栈空间上分配内存 —— 一个 Go 程序大部分的内存分配都是在栈空间上的。它的代价很低,因为只需要两个 CPU 指令:一个是把数据 push 到栈空间上以完成分配,另一个是从栈空间上释放。
不幸的是, 不是所有的内存都可以在栈空间上分配的。栈空间分配要求一个变量的生命周期和内存足迹能在编译时确定。 否则就需要在运行时在堆空间上进行动态分配。 malloc 必须找到一块足够大的内存来存放新的变量数据。后续释放时,垃圾回收器扫描堆空间寻找不再被使用的对象。 不用多说,这明显要比只需两个指令的栈分配更加昂贵。
小总结
不要过早优化,用数据来驱动我们的优化工作。
栈空间分配是廉价的,堆空间分配是昂贵的。
了解逃逸机制可以让我们写出更高效的代码。
指针的使用会导致栈分配更不可行。
找到在低效代码块中提供分配控制的 api。
在调用频繁的地方慎用 interface。
课程总结
本节课主要针对Go语言的内存管理进行了相关介绍,其中Go内存管理及优化十分有趣,值得深入学习。