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

122 阅读4分钟

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

Go 语言内存管理详解

优化

前言

  • 什么是性能优化 提升软件系统处理能力,减少不必要消耗,充分发掘计算机算力
  • 为什么要做性能优化 用户体验:让用户体验更好,比如刷视频不卡

资源高效利用:降低成本,提高效率

image.png

用测试驱动开发 image.png

自动管理内存

概念

image.png double-free:一块儿内存被释放后又被释放了一遍。
use-after-free:一块儿内存被释放后又被使用了。
这两个问题不仅仅会带来正确性的问题,程序很可能就crash了,甚至会带来一些安全漏洞。在CVE库上搜索这两个关键词会有很多漏洞。

GC三个任务:

  • 为新对象分配空间
  • 找到存活对象
  • 回收死亡对象的内存空间

image.png 这里Serial GC和Parallel GC都会暂停业务,而Concurrent GC可以让业务线程以及GC线程同时运行,当然这也会带来问题:

image.png 如果GC将o和a标记为存活对象后,o又指向了b,而b未被标记为存活对象,因此有可能被清除。
因此,Collectors必须感知对象指向关系的改变!

image.png

追踪垃圾回收

image.png 回收一共分为了三步:

  • 在全局变量和栈中标记根对象,即1,2,3.
  • 通过根对象找到并标记可达对象,即4,5.
  • 清理不可达对象,即6,7.这里分了三种方法: Copying GC:将存活的对象复制到另外的内存空间,然后当前内存空间就可以继续使用随意分配了。

image.png Mark-sweep GC:将死亡对象的内存标记为 可分配,组成一个链表,下次分配对象的时候可以直接使用free list中的空间

image.png Mark-compact GC:原地整理对象,compact即压缩。 image.png 一般来说,根据对象的生命周期使用不同的标记和清理策略 分代假说将对象分为了年轻代和老年代。
例如一个函数执行过程中创建了很多对象,但当返回结果后函数内的大部分对象都是应当被销毁的。因此很多对象在分配出来后很快就不再使用了。
年轻代和老年代的区分就是通过经历过多少次GC,经历的次数越多还活着说明越老越重要,因此可以分开管理,并用不同的GC策略。

年轻代使用Copying GC,是因为当前内存中可能90%的对象都应当销毁,只有小部分对象存活,只需要把这一小部分对象移动到另一块儿内存即可。
老年代使用Mark-sweep GC,因为他们大多数都会继续活着,只有少部分会被销毁,因此如果用Copying GC的话需要拷贝90%的对象,消耗很大,而Mark-sweep GC只需要他们留在原地即可。 image.png

引用计数

image.png

Go内存管理及优化

GO内存分配

分块

image.png 缓存

image.png

Go 内存管理构成了多级缓存机制,从 OS 分配得的内存被内存管理回收后,也不会立刻归还给 OS,而是在 Go runtime 内部先缓存起来,从而避免频繁向 OS 申请内存。内存分配的路线图如上。

GO内存管理优化

image.png 优化方案: Balanced GC

image.png 这里虽然很好,通过对GAB的一次分配,省略了很多小对象的长的分配路径,直接从GAB里调整top指针位置即可(指针碰撞的方式),但是因为小对象生命周期较短,很快都死掉了,但GAB作为一个大对象,只要里面有一个小对象存活GAB就会被认为是存活的,从而不会被回收。

image.png

编译器和静态分析

基本介绍

编译器的结构:

image.png

静态分析

image.png

过程内和过程间分析

image.png

GO编译器优化

image.png 因为想要优化获得更高效的机器码需要花时间去分析代码,然后会使编译时间变长,而GO语言本身编译时间较短,没必要优化。

字节为了让自己的后端长期执行的任务更加高效,创建了Beast mode模式,里面用了很多优化技术,这里主要讲前两个。

函数内敛

image.png

image.png 可见函数内敛提升了大量的性能

image.png

Beast Mode

字节自己的搞优化的产品

image.png

逃逸分析

image.png 即如果这个指针传递出去了,就可以被外界访问到,那么就会给GC压力。而上一步的函数内敛让更多的对象不再逃逸,因此可以在栈上更加快的分配,也减少了GC的负担。

总结

今日学习了go语言的内存管理,以及不同的回收策略。之后学习了编译器和静态分析,以及对Go编译器的一些优化思路,受益匪浅。