高性能 Go 语言发行版优化与落地实践(4)| 青训营笔记

240 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记。

自动内存管理

动态内存:程序在运行时根据需求动态分配内存
自动内存管理(垃圾管理):由程序的运行时系统管理动态内存\

  • 为新对象分配空间
  • 找到存活对象
  • 回收死亡对象的内存空间

自动内存管理-相关概念 image.png

Go内存管理及优化

分块

目标:为对象在heap上分配内存,分成的块称作mspan
mspan类型
GC不需要扫描:noscan mspan:分配不包含指针的对象
GC需要扫描:scan mspan:分配包含指针的对象\

缓存

image.png

Go内存管理优化

  • 对象分配是非常高频的操作:每秒分配GB级别的内存
  • 小对象占比较高
  • Go内存分配比较耗时

优化总结

image.png

编译器和静态分析

基本介绍

image.png

数据流和控制流

image.png

过程内和过程间分析

过程内分析:仅在函数内部进行分析
过程间分析:考虑函数调用时参数传递和返回值的数据流和控制流

GO编译器优化

编译优化的思路:

  • 场景:面向后端长期执行任务
  • Tradeoff:用编译时间换取更高效的机器码

函数内联

内联:将被调用函数的函数体的副本替换到调用位置上,同时重写代码以反映参数的绑定。
优点:

  • 消除函数调用开销,例如传递参数
  • 过程间分析转化为过程内分析,帮助其他优化,例如逃逸分析

缺点:

  • 函数体变大
  • 编译生成的Go的镜像变大

函数内联在大多数情况下是正向优化\

逃逸分析

逃逸分析:分析代码中指针的动态作用域:指针在何处可以被访问
Beast Mode:函数内联拓展了函数边界,更多对象不逃逸
优化:未逃逸的对象可以在栈上分配

  • 对象在栈上分配和回收很快:移动sp
  • 减少在heap上的分配,降低GC负担