Go语言后端 | 青训营笔记

47 阅读2分钟

这是我参与[第五届青训营]伴学笔记创作活动的第4天。这节课的主题是高性能Go语言发行版优化与落地实践。

  1. 本节课重点内容 本节课主要从四个方面进行阐述:第一部分是自动内存管理;第二部分是Go内存管理及优化;第三部分是编译器与静态分析;第四部分是Go编译器优化。

  2. 详细知识点介绍

  • 自动内存管理 动态内存:程序在运行时根据需求动态分配的内存,使用malloc();自动内存管理(垃圾回收,Garbage collector,简称GC)是指由程序语言的运行时系统管理分配内存,避免手动内存管理,提高内存使用的正确性和安全性。三个主要任务:为新对象分配空间、找到存活对象、回收死亡对象的内存空间。 1.png

2.png

  • 追踪垃圾回收(Tracing garbage collection) 3.png

4.png

5.png

  • 分代GC(Generational GC):根据不同对象的生命周期,使用不同的标记和清理策略,主要可以分为年轻代和老年代。 6.png

  • 引用计数(Reference counting) 7.png

  • Go内存管理及优化

    Go内存分配——分块 1.png

    Go内存分配——缓存 2.png

对象分配是非常高频的操作,小对象的占比较高,Go内存分配比较耗时,其分配路径长。采用GAB进行优化。 3.png 4.png

  • 编译器与静态分析 5.png 6.png 7.png

  • Go编译器优化:函数内联、逃逸分析 8.png 函数内联的缺点:函数体变大,对指令cache不友好;编译生成的Go镜像变大 但函数内联在大多数情况下是正向优化。

  • Beast Mode

限制:Go函数内联受到的限制较多,语言限制例如interface、defer等限制了函数内联 Beast Mode调整函数内联的策略,使更多函数被内联。降低了函数调用的开销,增加了其他优化的机会,如逃逸分析。

  • 逃逸分析 9.png