这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
性能优化是什么?
- 提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力
为什么要做性能优化?
- 用户体验:带来用户体验的提升——让刷抖音更丝滑,让双十一购物不再卡顿
- 资源高效利用:降低成本,提高效率——很小的优化乘以海量机器会是显著的性能提升和成本节约
性能优化的层面:业务层优化、语言运行时优化、数据驱动
业务代码 | SDK | 基础库 | 语言运行时 | OS
自动内存管理
动态内存
- 程序在运行时根据需求动态分配的内存:malloc()
自动内存管理(垃圾回收):由程序语言的运行时系统管理动态内存
- 避免手动内存管理,专注于实现业务逻辑
- 保证内存使用的正确性和安全性:double-free problem, use-after-free problem
三个任务
- 为新对象分配空间
- 找到存活对象
- 回收死亡对象的内存空间
Go内存管理及优化
Go内存分配——分块
目标:为对象在heap上分配内存
提前将内存分块
对象分配:根据对象的大小,选择最合适的块返回
Go内存分配——缓存
Go内存管理优化
我们的优化方案:Balanced GC
GAB (goroutine allocation buffer) 对于Go内存管理来说是一个对象
本质:将多个小对象的分配合并成一次大对象的分配
问题:GAB的对象分配方式会导致内存被延迟释放
方案:移动GAB中存活的对象
- 当GAB总大小超过一定阈值时,将GAB中存活的对象复制到另外分配的GAB中
- 原先的GAB可以释放,避免内存泄漏
- 本质:用copying GC的算法管理小对象(根据对象的生命周期,使用不同的标记和清理策略)