Golang基础:青训营第四节课|青训营笔记

79 阅读3分钟

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

这是我自我重点记录,来不及看视频的朋友可以快速浏览或者复习。 部分内容来自官方和PPT,确保权威性和正确性

本次主题是高性能 Go 语言发行版优化与落地实践

我们先梳理一下主题顺序

  1. 自动内存管理
  1. Go 内存管理及优化
  1. 编译器和静态分析
  1. Go 编译器优化

以下为具体内容显示

自动内存管理

我们首先要知道的相关中英文对应解释

  • Auto memory management: 自动内存管理
  • Grabage collction: 垃圾回收
  • Mutator: 业务线程
  • Collector: GC 线程
  • Concurrent GC: 并发 GC
  • Parallel GC: 并行 GC
  • Tracing garbage collection: 追踪垃圾回收

    • Copying GC: 复制对象 GC
    • Mark-sweep GC: 标记-清理 GC
    • Mark-compact GC: 标记-压缩 GC
  • Reference counting: 引用计数
  • Generational GC: 分代 GC

    • Young generation: 年轻代
    • Old generation: 老年代

Snipaste_2022-05-14_18-41-56.png 【本图阐释了几种不同的自动内存管理的区别】

Snipaste_2022-05-14_18-43-38.png 【本图为阐释追踪垃圾回收】 下面将展示不同的内存空间的分配方式

Snipaste_2022-05-14_18-45-10.png

Snipaste_2022-05-14_18-45-17.png

Snipaste_2022-05-14_18-45-25.png

此外还介绍了 “引用计数”

  • 每个对象都有一个与之关联的引用数目
  • 对象存活的条件:当且仅当引用数大于 0
  • 优点

    • 内存管理的操作被平摊到程序运行中:指针传递的过程中进行引用计数的增减
    • 不需要了解 runtime 的细节:因为不需要标记 GC roots,因此不需要知道哪里是全局变量、线程栈等
  • 缺点

    • 开销大,因为对象可能会被多线程访问,对引用计数的修改需要原子****操作保证原子性和可见性
    • 无法回收环形数据结构
    • 每个对象都引入额外存储空间存储引用计数
    • 虽然引用计数的操作被平摊到程序运行过程中,但是回收大的数据结构依然可能引发暂停

Go内存管理优化

Snipaste_2022-05-14_18-49-47.png 【内存分配管理示意图】 此时提及了Balanced CG 对BALANCED CG的解释图

Snipaste_2022-05-14_18-50-09.png

Snipaste_2022-05-14_18-51-02.png 从中我们可以了解到其是如何实现内存的分配的

编译器与静态分析

Snipaste_2022-05-14_18-53-32.png 【编译器的结构示意图】 需要了解的概念

  • 静态分析:不执行代码,推导程序的行为,分析程序的性质。
  • 控制流:程序的执行流程
  • 数据流:数据在控制流上的传递

Snipaste_2022-05-14_18-54-50.png

Snipaste_2022-05-14_18-54-59.png 从官方的图片上可以直观感受到其中的区别和,以上名词的含义

过程内分析:在函数内进行控制流和数据流的分析 过程间分析:除了函数内的分析,还需要考虑跨函数的数据流和控制流,例如参数传递,函数返回值等

编译器优化

优化的目的

  • 用户无感知,重新编译即可获得性能收益

Snipaste_2022-05-14_19-03-13.png 提及了字节的BeastMode

Snipaste_2022-05-14_19-03-23.png