go语言内存管理详解 | 青训营笔记

52 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天

本堂课重点内容

性能优化及自动内存管理

go内存管理和编译优化思路

详细知识点介绍

自动内存管理

相关概念

Mutator:业务线程,即用户启动的线程,分配新对象,修改对象指定关系

Collector:GC线程,找到存活对象,回收死亡对象的内存空间

Serial GC:只有一个collector

image.png

Paraller GC:支持多个collectors同时回收的GC算法

image.png

Concurrent GC:Mutators和Collectors可以同时执行

image.png

追踪垃圾回收

image.png

变量指针指向的所有可达对象先进行标记,然后清理所有不可达的对象 ,根据对象不同的生命周期,使用不同的标记和清理策略

引用计数

每个对象都有一个与之关联的引用数目

image.png

缺点:无法回收环形数据结构,如图所示

image.png

维护引用计数的开销较大;每个对象都引入的额外内存空间存储引用数目造成内存开销;回收内存依然可能引发暂停

编译器和静态分析

编译器的结构

image.png

前端负责生成词素、语法树,收集类型信息,进行语义检查,后端则负责机器无关优化,生成优化后的IR以及生成目标代码。

go编译器优化

函数内联 内联:将被调用的函数体的副本替换到调用位置上,同时重写代码以反映参数的绑定。 优点:消除函数调用开销;将过程分析转化为过程内分析。 缺点:函数体变大;编译生成的go镜像变大

逃逸分析

概念:分析代码中指针的动态作用域,指针在何处可以被访问 优化:未逃逸的对象可以在栈上分配