这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
concurrent gc:gc过程中如果标记存活的对象完成后,存活的对象可能会指向一还没被标记的存活的对象
此时已标记对象执行的对象也要被标记,即要感知对象指向关系的改变
两种常见的gc的技术:追踪垃圾回收,引用计数
清理也有多种方法
compact gc跟copy gc很像,不过它是复制到原来内存的开头位置,copy gc是复制到另外一块空间
分代gc就是体现了需要根据对象的生命周期来使用不同的标记和清理策略
原子操作通常开销会比较大
图中红色的环形结构是可以被整个回收的,但是因为每个环结点的被引用数都是1,所以就都回收不了
图中绿色环变成null后,其指向的那条链实际上整条都可被回收,但需要时间将它们被引用数都改成0,
即使内存管理操作已经平摊到程序执行过程,但仍可引发暂停
go的内存分配借鉴了TCMalloc 即建立多级缓存,加快内存分配的速度
存在的问题就是一个g里面只有一小块空间还在使用,整个g就是存活的,得等全部空间未使用,才能释放,所以是延迟释放
有了控制流图之后就可以在控制流图上传播数据的信息,从而知道程序的一些性质。当确定一段函数返回的是确定的数据后,就会直接进行编译优化,如图,如果有一段函数是图中代码,就不会再去生成计算,而是直接生成return 4一条语句就行
内联相当于把函数复制了很多份,到原来需要使用到这个函数的地方