这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
本堂课重点内容
性能优化及自动内存管理
go内存管理和编译优化思路
详细知识点介绍
自动内存管理
相关概念
Mutator:业务线程,即用户启动的线程,分配新对象,修改对象指定关系
Collector:GC线程,找到存活对象,回收死亡对象的内存空间
Serial GC:只有一个collector
Paraller GC:支持多个collectors同时回收的GC算法
Concurrent GC:Mutators和Collectors可以同时执行
追踪垃圾回收
变量指针指向的所有可达对象先进行标记,然后清理所有不可达的对象 ,根据对象不同的生命周期,使用不同的标记和清理策略
引用计数
每个对象都有一个与之关联的引用数目
缺点:无法回收环形数据结构,如图所示
维护引用计数的开销较大;每个对象都引入的额外内存空间存储引用数目造成内存开销;回收内存依然可能引发暂停
编译器和静态分析
编译器的结构
前端负责生成词素、语法树,收集类型信息,进行语义检查,后端则负责机器无关优化,生成优化后的IR以及生成目标代码。
go编译器优化
函数内联 内联:将被调用的函数体的副本替换到调用位置上,同时重写代码以反映参数的绑定。 优点:消除函数调用开销;将过程分析转化为过程内分析。 缺点:函数体变大;编译生成的go镜像变大
逃逸分析
概念:分析代码中指针的动态作用域,指针在何处可以被访问 优化:未逃逸的对象可以在栈上分配