这是我参与「第五届青训营」伴学笔记创作活动的第6天。这篇笔记主要记录下内存管理优化和编译器优化的一部分知识,内容有自动内存管理和Go内存管理机制,编译器优化的基本问题和思路。
自动内存管理,又叫垃圾回收(GC),是指由程序语言的运行时系统管理动态内存。其中,动态内存是指程序在运行时根据需求动态分配的内存。它的作用有避免手动内存管理,专注于实现业务逻辑和保证内存使用的正确性和安全性。它的任务是为新对象分配空间,找到存活对象和回收死亡对象的内存空间。GC有3种,Serial GC:只有一个collector,Parallel GC:支持多个collectors同时回收的GC算法,Concurrent GC: mutator(s)和collector(s)可以同时执行,collectors必须感知对象指向关系的改变。其中,Collector是GC线程,任务找到存活对象,回收死亡对象的内存空间,Mutator是业务线程,任务是分配新对象,修改对象指向关系。常见GC算法有追踪垃圾回收和引用计数。
编译器是重要的系统软件。它能够识别符合语法和非法的程序,生成正确且高效的代码。它有两个部分,分析部分和综合部分。分析部分做词法分析,生成词素;语法分析,生成语法树;语义分析,收集·代码优化,机器无关优化,生成优化后的IR·代码生成,生成目标代码类型信息,进行语义检查;中间代码生成,生成intermediate representation。综合部分做代码优化,机器无关优化,生成优化后的IR;代码生成,生成目标代码。GO编译器优化有函数内联和逃逸分析。函数内联指将被调用函数的函数体(callee)的副本替换到调用位置(caller)上,同时重写代码以反映参数的绑定。优点有消除函数调用开销,例如传递参数、保存寄存器等,将过程间分析转化为过程内分析,帮助其他优化,例如逃逸分析。缺点是函数体变大,instruction cache不友好,编译生成的Go镜像变大。逃逸分析指分析代码中指针的动态作用域,这样未逃逸的对象可以在栈上分配。