高性能Go | 青训营笔记

62 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

性能优化是什么?

  • 提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力

为什么要做性能优化?

  • 用户体验:带来用户体验的提升——让刷抖音更丝滑,让双十一购物不再卡顿
  • 资源高效利用:降低成本,提高效率——很小的优化乘以海量机器会是显著的性能提升和成本节约

性能优化的层面:业务层优化、语言运行时优化、数据驱动

业务代码 | SDK | 基础库 | 语言运行时 | OS

自动内存管理

动态内存

  • 程序在运行时根据需求动态分配的内存:malloc()

自动内存管理(垃圾回收):由程序语言的运行时系统管理动态内存

  • 避免手动内存管理,专注于实现业务逻辑
  • 保证内存使用的正确性安全性:double-free problem, use-after-free problem

三个任务

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

image-20230207165724328.png

image-20230207165741966.png

Go内存管理及优化

Go内存分配——分块

目标:为对象在heap上分配内存

提前将内存分块

对象分配:根据对象的大小,选择最合适的块返回

Go内存分配——缓存

image-20230207170845411.png

Go内存管理优化

image-20230207171424787.png

我们的优化方案:Balanced GC

GAB (goroutine allocation buffer) 对于Go内存管理来说是一个对象

本质:将多个小对象的分配合并成一次大对象的分配

问题:GAB的对象分配方式会导致内存被延迟释放

方案:移动GAB中存活的对象

  • 当GAB总大小超过一定阈值时,将GAB中存活的对象复制到另外分配的GAB中
  • 原先的GAB可以释放,避免内存泄漏
  • 本质:用copying GC的算法管理小对象(根据对象的生命周期,使用不同的标记和清理策略)

image-20230207171749901.png