02 Go内存管理及优化
2.1Go内存分配
2.1.1 - 分块
目标:为对象在heao上分配内存
提前将内存分块:
- 调用系统调用mmap()向OS申请一大块内存,如4MB
- 现将内存划分成大块,例如8KB,称作mspan
- 再讲大块继续划分成特定大小的小块,用于对象分配
- noscan mspan:分配不包含指针的对象 -- GC不需要扫描
- scan mspan:分配包含指针的对象 -- GC需要扫描
对象分配:根据对象的大小,分配最合适的内存返回
2.1.2 - 缓存
TCMalloc:thread caching
2.2Go内存管理优化
2.3字节跳动优化方案 - Balanced GC
图中黑色部分的对象存活,整个GAB都不能被释放
解决方案:移动GAB中存活的对象
-
当GAB总大小超过一定阈值时,将GAB中存活的对象复制到另外分配的GAB中
-
原先的GAB可以释放,避免内存泄漏
-
本质:用copying GC 的算法管理小对象
根据对象的生命周期,使用不同的标记和清理策略