Go语言内存优化管理--工程篇| 青训营笔记

39 阅读2分钟

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

自动内存管理

Auto memory management: 自动内存管理 GCgo语言处理堆内存的管理方式

image.png

Grabage collction: 垃圾回收//释放过期的或者异常对象内存

Mutator: 业务线程//分配内存给对象,修改对象指向关系

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

Concurrent GC: 并发 GC //上述两个同时执行,分配内存给新对象,也回收死亡对象内存

Parallel GC: 并行 GC//支持多个Collector同时回收内存

注:Collectors必须感知对象指向关系的改变

Tracing garbage collection: 追踪垃圾回收//遍历标记正常对象删除所有不可达对象,释放内存

Copying GC: 复制对象 GC//将存活的对象复制新空间保存 Mark-sweep GC: 标记-清理 GC//将死亡对象内存区标记可分配 Mark-compact GC: 标记-压缩 GC//复制存活对象在开头

Reference counting: 引用计数//近似于C++的智能指针,缺点开销大,多线程访问需要确保原子操作

Go 内存管理及优化

TCMalloc(分配堆内存给对象)

mmap() 系统调用//向系统申请大块内存

scan object 和 noscan object//GC需要扫描|GC不需要扫描

mspan, mcache, mentral(多级缓存机制,避免反复向系统申请内存)

image.png

Bump-pointer object allocation: 指针碰撞风格的对象分配//新建更小处理内存

编译器和静态分析

词法分析

语法分析

语义分析

Intermediate representation (IR) 中间表示

代码优化

代码生成

Control flow: 控制流图

Data flow: 数据流图

Intra-procedural analysis 过程内分析//具体函数体

Inter-procedural analysis: 过程间分析

Go 编译器优化

Function inlining: 函数内联//被调函数体副本替换到调用位置上明显提升性能

Escape analysis: 逃逸分析//指针的动态作用域不逃逸出当前指向对象可以在栈上分配