这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记。
这是我自我重点记录,来不及看视频的朋友可以快速浏览或者复习。 部分内容来自官方和PPT,确保权威性和正确性
本次主题是高性能 Go 语言发行版优化与落地实践
我们先梳理一下主题顺序
- 自动内存管理
- Go 内存管理及优化
- 编译器和静态分析
- Go 编译器优化
以下为具体内容显示
自动内存管理
我们首先要知道的相关中英文对应解释
- 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: 老年代
【本图阐释了几种不同的自动内存管理的区别】
【本图为阐释追踪垃圾回收】
下面将展示不同的内存空间的分配方式
此外还介绍了 “引用计数”
- 每个对象都有一个与之关联的引用数目
- 对象存活的条件:当且仅当引用数大于 0
-
优点
- 内存管理的操作被平摊到程序运行中:指针传递的过程中进行引用计数的增减
- 不需要了解 runtime 的细节:因为不需要标记 GC roots,因此不需要知道哪里是全局变量、线程栈等
-
缺点
- 开销大,因为对象可能会被多线程访问,对引用计数的修改需要原子****操作保证原子性和可见性
- 无法回收环形数据结构
- 每个对象都引入额外存储空间存储引用计数
- 虽然引用计数的操作被平摊到程序运行过程中,但是回收大的数据结构依然可能引发暂停
Go内存管理优化
【内存分配管理示意图】
此时提及了Balanced CG
对BALANCED CG的解释图
从中我们可以了解到其是如何实现内存的分配的
编译器与静态分析
【编译器的结构示意图】
需要了解的概念
- 静态分析:不执行代码,推导程序的行为,分析程序的性质。
- 控制流:程序的执行流程
- 数据流:数据在控制流上的传递
从官方的图片上可以直观感受到其中的区别和,以上名词的含义
过程内分析:在函数内进行控制流和数据流的分析 过程间分析:除了函数内的分析,还需要考虑跨函数的数据流和控制流,例如参数传递,函数返回值等
编译器优化
优化的目的
- 用户无感知,重新编译即可获得性能收益
提及了字节的BeastMode