这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
一、本堂课重点内容:
本堂课主要是讲述了高性能Go语言发行版优化与落地实践,在本次的学习中,我们了解了自动内存管理的基本概念,Go内存管理的性能问题以及优化思路,编译器和静态分析,以及Go编译器优化思路。
二、自动内存管理:
专业名词解释
- Mutator:业务线程,分配新对象,修改对象指向关系
- Collector.GC线程,找到存活对象,回收死亡对象的内存空间
- Serial GC:只有一个collector
- Parallel GC:支持多个collectors同时回收的 GC算法
- Concurrent GC: mutator(s) 和 collector(s) 可以同时执行
- Collectors必须感对象指向关系的改变!
三、Go内存管理及优化:
Go内存分配-分块
为对象在heap上分配内存
根据对象的大小,选择最合适的块返回
Balanced GC
方案:移动GAB中存活的对象
- 当GAB总大小超过一定阈值时,将GAB中存活的对象复制到另外分配的GAB中
- 原先的GAB可以释放,避免内存泄露
本质:用copying GC的算法管理小对象
四、编译器和静态分析:
编译器的结构
- 重要的系统软件: 识别符合语法和非法的程序;生成正确且高效的代码
- 分析部分:词法分析,生成词素;语法分析,生成语法树;语义分析,收集类型信息,进行语义检查;中间代码生成,生成intermediate representation(IR)
- 综合部分:代码优化,机器无关优化,生成优化后的IR;代码生成,生成目标代码
五、Go编译器优化:
函数内联
概念:将被调用函数的函数体(callee)的副本替换到调用位置(caller)上,同时重写代码以反映参数的绑定
优点:
- 消除函数调用开销,例如传递参数、保存寄存器等
- 将过程间分析转化为过程内分析,帮助其他优化,例快逃逸分折
缺点:
- 函数体变大,instruction cache (icache)不友好
- 编译生成的Go镜像变大
Beast Mode
Go函数内联受到的限制较多
Beast Mode 可以调整内联策略,使得更多函数被内联;降低开销,有助于逃逸分析
六、课后个人总结:
今天的课程内容是之前从来都没有接触过的,通过这次课对内存管理,对Go语言的一些优化手段有了更深得了解。