这是我参加「第五届青训营」笔记创作活动的第三天
一、概述
内存管理
静态分析
二、内存管理
自动内存管理GC
自动内存管理(垃圾回收):程序语言运行时由系统自动回收动态内存
垃圾回收主要任务:
1、为新对象分配空间
2、找到存活对象
3、回收死亡对象的内存空间
Mutator:业务线程,主要用于分配对象空间,修改对象指向关系
Collector:GC线程,寻找存活对象,回收对象空间
Serial GC:只有一个GC线程用于回收
Parallel GC:多个GC线程
Concurrent GC:Mutator线程和Collector线程能够同时执行
评价GC算法的指标:安全性、吞吐率、暂停时间以及内存开销
GC算法主要有:追踪垃圾回收、引用计数
追踪垃圾回收
标记根对象(全局变量、静态变量、常量以及线程栈),通过指针标记所有可达对象,回收不可达对象
根据对象生命周期的不同,采取不同的垃圾回收策略
1、复制所有存活对象到另外的内存空间
2、标记所有死亡对象的内存空间为可分配内存
3、移动整理所有存活对象
分代GC:
每个对象GC的次数,为对象分配年龄
对年轻和老年的对象采取不同的垃圾回收策略
- 年轻代存活对象数量少,采取复制策略
- 老年代经过多轮GC依旧存活,继续存活的可能性较高,采用标记内存空间策略
引用计数
每个对象都有与之关联的引用数目,当引用计数归零时回收内存空间
优点:
无需关心runtime实现细节
内存管理操作在程序执行过程中
缺点:
开销较大,需要保证对引用计数的原子操作
环形结构无法回收
内存开销较大
Go内存管理
提前将内存分块,根据对象的大小选择合适的块返回
采用多级缓存的结构进行内存分配
Balanced GC
由于对象分配非常频繁且小对象占比高,可以提前向os申请一块大的内存空间(1KB)--GAB
对于小对象的内存分配,直接在GAB上进行,无需经过原流程
由于GAB本质上是一块一次性申请的大空间,当GAB上的小对象仅占极少部分空间时,其余内存空间仍不能释放,导致内存浪费问题
解决方法:将GAB上的小对象复制到其他有空余内存空间的GAB上,原GAB空间可以释放
二、静态分析
静态分析:不执行代码,推导程序行为
控制流:程序运行的流程
数据流:数据在控制流上的传递
过程内分析:仅在函数内部分析
过程间分析:需要考虑函数调用时参数传递和返回的数据流和控制流
go编译器优化:
-
函数内联
-
逃逸分析