这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
内存管理
性能优化
性能优化是什么?
- 提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力
为什么要做性能优化?
- 用户体验:带来用户体验的提升
- 资源高效利用:降低成本,提高效率
性能优化的层面
- 业务层优化
- 针对特定场景,具体问题具体分析
- 容易获得较大的性能收益
- 语言运行时优化
- 解决更通用的性能问题
- 考虑更多场景
- Tradeoffs
- 数据驱动
- 自动性能分析工具--pprof
- 依靠数据而非猜测
- 首先优化最大瓶颈
自动内存管理
- 动态内存
- 程序在运行时根据需求动态分配的内存:malloc()
- 自动内存管理(垃圾回收):有程序语言的运行时系统管理动态内存
- 避免手动内存管理,专注于业务逻辑的实现
- 保证内存使用的安全性与正确性:double-free problem, use-after-free problem
自动内存管理相关概念
- mutator:业务线程,分配新对象,修改对象指向关系
- Collector:GC线程,找到存活对象,回收死亡对象的内存空间
- Serial GC: 只有一个collector
- Parrallel GC:支持多个Collectors同时回收的GC算法
- Concurrent GC: mutators和collectors可以同时执行
如何评价GC算法
垃圾回收
分代GC
引用计数
分块
目标:为对象在heap上分配内存
提前将内存分块:调用系统调用mmap(),向OS申请一大块内存;将其划分成大块,称作mspan,再将大块分成特定大小的小块,用于对象分配,根据对象的大小,选择最合适的块返回。小块有两种类型,
-
noscan mspan:分配不含指针的对象,GC不需要扫描
-
scan mspan:分配含指针的对象,GC需要扫描
缓存
GMP模型中,每个p包含一个mcache用于快速分配,用于为绑定于p上的G分配对象;mcache管理一组mspan
Balanced GC
每个G都绑定一大块内存(1KB),称作 goroutine allocation buffer(GAB)
GAB用于noscan类型的小对象分配:<128 B
GAB对于Go内存管理来说是一个对象。