这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
首先是前置知识
自动内存管理
- Auto memory management: 自动内存管理
- Grabage collction: 垃圾回收
- Mutator: 业务线程
- Collector: GC 线程
- Concurrent GC: 并发 GC
- Parallel GC: 并行 GC
-
Tracing garbage collection: 追踪垃圾回收
- Copying GC: 复制对象 GC
- Mark-sweep GC: 标记-清理 GC
- Mark-compact GC: 标记-压缩 GC
- Reference counting: 引用计数
-
Generational GC: 分代 GC
- Young generation: 年轻代
- Old generation: 老年代
Go 内存管理及优化
- TCMalloc
mmap()系统调用
- scan object 和 noscan object
- mspan, mcache, mentral
- Bump-pointer object allocation: 指针碰撞风格的对象分配
编译器和静态分析
- 词法分析
- 语法分析
- 语义分析
- Intermediate representation (IR) 中间表示
- 代码优化
- 代码生成
- Control flow: 控制流
- Data flow: 数据流
- Intra-procedural analysis 过程内分析
- Inter-procedural analysis: 过程间分析
Go 编译器优化
- Function inlining: 函数内联
- Escape analysis: 逃逸分析
了解了这些后老师开始讲 在GO中如何进行性能优化
主要这几个方面 追踪垃圾回收 引用计数 以及内存缓存
其中最值得注意到个人认为应该是字节自己的性能优化
字节中 经过分析后发现 更多代码运行的小块 并不需要很大的内存 所以做了一个资源整合的操作 类似 自己提前分配好了一个 一定大小的内存块 自定 GAB(per-g allocation buffer)
然后讲GAB中设置指针计数 只需要讲这些小的放入这个GAB中就可以 优化小的代码块内存的分配 即使这个内存块中 有很大的空缺 也可以使用copy复制到另一个整合的内存块中 大大降低了内存空间的浪费