后端进阶-go语言内存管理 | 青训营笔记

59 阅读2分钟

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

image.png concurrent gc:gc过程中如果标记存活的对象完成后,存活的对象可能会指向一还没被标记的存活的对象

此时已标记对象执行的对象也要被标记,即要感知对象指向关系的改变

image.png 两种常见的gc的技术:追踪垃圾回收,引用计数

image.png 清理也有多种方法

image.png

image.png

image.png compact gc跟copy gc很像,不过它是复制到原来内存的开头位置,copy gc是复制到另外一块空间

image.png 分代gc就是体现了需要根据对象的生命周期来使用不同的标记和清理策略

image.png 原子操作通常开销会比较大

图中红色的环形结构是可以被整个回收的,但是因为每个环结点的被引用数都是1,所以就都回收不了

图中绿色环变成null后,其指向的那条链实际上整条都可被回收,但需要时间将它们被引用数都改成0,

即使内存管理操作已经平摊到程序执行过程,但仍可引发暂停

image.png go的内存分配借鉴了TCMalloc 即建立多级缓存,加快内存分配的速度

image.png 存在的问题就是一个g里面只有一小块空间还在使用,整个g就是存活的,得等全部空间未使用,才能释放,所以是延迟释放

image.png 有了控制流图之后就可以在控制流图上传播数据的信息,从而知道程序的一些性质。当确定一段函数返回的是确定的数据后,就会直接进行编译优化,如图,如果有一段函数是图中代码,就不会再去生成计算,而是直接生成return 4一条语句就行

image.png

image.png 内联相当于把函数复制了很多份,到原来需要使用到这个函数的地方