这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。
主要内容
本节课主要能学习到Go的内存优化方案介绍:
- 内存管理优化
背景
- 自动内存管理和内存管理机制
性能优化是为了什么呢
- 提升软件系统处理能力,减少消耗,充分发挥计算机的算力
- 用户体验
- 资源高效利用
自动内存管理相关概念
- Mutaor:业务流程
- Collector:GC
- Serical GC: only 一个collector
- Parallel GC:支持多个collector同时回收
- Concurrent GC:两个同时执行
- Pause: stop the world 一张图说明问题
介绍两种GC算法
- 追踪垃圾回收
- 引用计数 衡量指标:安全性、吞吐率、stop the world time、内存开销
追踪垃圾回收
使用标记的方法(静态变量、全局变量、常量、线程栈等),标记找到可达的对象,清理所有不可达对象
清理的时候主要有三种方法:
- 将存活对象复制到另外的内存空间 Copying GC(年轻代比较适合)
- 将死亡对象的内存标记为可分配 Mark-sweep GC(老年代比较适合)
- 移动并整理存活对象 Mark-compact GC
引用计数
被指向就计数+1,当等于0时就代表这个对象要被清理,但是如果时环的时候需要特殊考虑下,需要使用别的策略去回收
Go内存分配-分块
本质上讲就是提前在heap上分块,然后将差不多大小合适的块给到对象
Go内存分配-缓存
- 每个p包含一个mcache用于快速分配,用于为绑定于p上的g分配对象
- mcache管理一组mspan
- 当mspan分配完毕,向mcentral申请带有未分配快的msapn
- 当mspan没有分配的对象,并不会立即释放还给os,而是会缓存在mcentral中
- G: 取 goroutine 的首字母,主要保存 goroutine 的一些状态信息以及 CPU 的一些寄存器的值
- M: 取 machine 的首字母,它代表一个工作线程,或者说系统线程。G 需要调度到 M 上才能运行,M 是真正工作的人
- P:取 processor 的首字母,为 M 的执行提供“上下文”,保存 M 执行 G 时的一些资源,例如本地可运行 G 队列,memeory cache 等。
字节的内存优化方案:Balanced GC
- 每个g都绑定1块大小为1kb的内存,称作GAB
- 满足两个条件,第一是noscan类型对象,第二<128B(这么定的原因是根据生产环境测试统计下来的)
- 三个指针维护base(需要在h外部定义一个特殊的数据结构,来方便找到位置),end,top
缺点
带来的问题,内存会被延迟释放,所以使用copying GC的算法管理小对象