这是我参与「第五届青训营」伴学笔记创作活动的第 4 天。
课堂笔记
一、本堂课重点内容:
- 自动内存管理概念
- Go内存管理及优化
二、具体案例:
1. 自动内存管理概念
1.1 动态内存
程序在运行时根据需求所动态分配的内存,如C语言的malloc()和C++的new。
1.2 自动内存管理(垃圾回收)
由程序语言的运行时系统对动态内存进行回收,避免易出错且繁杂的手动内存管理。
1.3 内存管理的三个任务
- 为新对象分配空间
- 找到存活的对象
- 回收死亡对象的内存空间
1.4 内存管理中的名词
- Mutator
推荐使用gofmt或者goimports自动格式化代码
- Collector
GC 线程,找到存活对象,回收死亡对象的内存空间
- Serial GC
只有一个 collector
- Parallel GC
支持多个 collectors 同时回收的 GC 算法
-
Concurrent GC
mutator 和 collector 可以同时执行,必须感知到对象指向关系的改变
1.5 内存管理算法的评价指标
- 安全性: 不能回收存活的对象
- 吞吐率: 花在 GC 上的时间
- 暂停时间: stop the world,暂停逻辑代码
- 内存开销: GC 元数据开销
1.6 常见的内存管理方法
- 追踪垃圾回收
-
分代GC
- 分代假说(Generational hypothesis): most objects die young
- Intuition:很多对象在分配出来后很快就不再使用了
- 每个对象都有年龄:经历过GC的次数
- 目的:对年轻和老年的对象,制定不同的GC策略,降低整体内存管理的开销
-
不同年龄的对象处于heap的不同区域
-
年轻代(Young generation)
- 常规的对象分配
- 由于存活对象很少,可以采用copying collection
- GC吞吐率很高
-
老年代(Old generation)
- 对象趋向于一直活着,反复复制开销较大
- 可以采用mark-sweep collection
- 引用计数
2. 自动内存管理概念
2.1 分块
2.3 缓存
2.2 go内存管理优化
-
对象分配是非常高频的操作:每秒分配GB级别的内存
-
小对象占比较高
-
Go内存分配比较耗时
- 分配路径长:g ->m -> p ->mcache -> mspan -> memory block -> return pointer
- pprof:对象分配的函数是最频繁调用的函数之一
2.5 优化方案-Balanced GC
2.3 Balanced GC
- 性能效益
三、课后个人总结
性能优化在提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力,可以降低成本,提高效率一很小的优化乘以海量机器会是显著的性能提升和成本节约。