这是我参与[第五届青训营]伴学笔记创作活动的第4天。这节课的主题是高性能Go语言发行版优化与落地实践。
-
本节课重点内容 本节课主要从四个方面进行阐述:第一部分是自动内存管理;第二部分是Go内存管理及优化;第三部分是编译器与静态分析;第四部分是Go编译器优化。
-
详细知识点介绍
- 自动内存管理
动态内存:程序在运行时根据需求动态分配的内存,使用malloc();自动内存管理(垃圾回收,Garbage collector,简称GC)是指由程序语言的运行时系统管理分配内存,避免手动内存管理,提高内存使用的正确性和安全性。三个主要任务:为新对象分配空间、找到存活对象、回收死亡对象的内存空间。
- 追踪垃圾回收(Tracing garbage collection)
-
分代GC(Generational GC):根据不同对象的生命周期,使用不同的标记和清理策略,主要可以分为年轻代和老年代。
-
引用计数(Reference counting)
-
Go内存管理及优化
Go内存分配——分块
Go内存分配——缓存
对象分配是非常高频的操作,小对象的占比较高,Go内存分配比较耗时,其分配路径长。采用GAB进行优化。
-
编译器与静态分析
-
Go编译器优化:函数内联、逃逸分析
函数内联的缺点:函数体变大,对指令cache不友好;编译生成的Go镜像变大 但函数内联在大多数情况下是正向优化。
-
Beast Mode
限制:Go函数内联受到的限制较多,语言限制例如interface、defer等限制了函数内联 Beast Mode调整函数内联的策略,使更多函数被内联。降低了函数调用的开销,增加了其他优化的机会,如逃逸分析。
- 逃逸分析