高性能Go优化(上)——Go青训营笔记
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
一、性能优化
1. 概述
性能优化——提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力
优势:提升用户体验、资源高效利用,降低成本,提高效率。
2.性能优化层面
业务代码——SDK(软件开发工具包)——基础库——语言运行时——OS
业务层优化:
- 针对特定场景,具体问题,具体分析
- 容易获得较大性能收益
预约运行时优化:
- 解决更通用的性能问题
- Tradeoffs
数据驱动:
- 自动化性能分析工具——pprof
- 依靠数据而非猜测
- 优化最大瓶颈优先
Go SDK至关重要
性能优化注意事项:
- 软件质量至关重要
- 在保证接口稳定的前提下改进具体实现
- 测试用例:覆盖尽可能多的场景,方便回归
- 文档表示:做了什么,没做什么,达到效果等等
- 隔离:通过选项控制是否开启优化
- 可观测——即有必要的日志输出
1. 自动内存管理
相关名词概念
- Auto memory management: 自动内存管理
- Grabage collction(GC): 垃圾回收
- Mutator:业务线程,分配新对象,修改对象指向关系。
- Collector: GC 线程,找到存活对象,回收死亡对象的内存空间
- Serial GC:只有一个collector
- Parallel GC:并行GC,支持多个collectors同时回收的GC算法
- Concurrent GC:并发 GC,mutators(s)和collector(s)可以同时进行。(不需要暂停,即STW(stop the word)模式)
(故Collectors必须感知对象指向关系的改变)
-
评价GC算法相关名词:
- 安全性(Safety):——基本要求:不能回收存活的对象
- 吞吐率(Throughput):——花在GC上的时间:1-(GC时间/程序执行总时间)
- 暂停时间(Pause time):——业务是否感知:STW
- 内存开销(Space overhead):——GC元数据开销(越小越好)
-
追踪垃圾回收(Tracing garbage collection)
-
对象被回收的条件:指针指向关系不可达的对象
-
标记根对象:——静态变量、全局变量、常量、线程栈等等
-
标记:找到可达对象——求指针指向关系的传递闭包:从根对象出发,找到所有可达对象
-
清理:所有不可达对象(根据对象的生命周期,使用不同的标记和清理策略)
-
将存活对象复制到另外的内存空间(Copying GC)
-
将死亡对象的内存标记为”可分配“(Mark-sweep GC)
-
移动并整理存活对象(Mark-compact GC)
-
-
-
分代GC(Generational GC)
- Young generation: 年轻代
- Old generation: 老年代
-
引用计数
- 每个对象都有一个与之关联的引用数目
- 对象存活的条件:当且仅当引用数大于0
图中圈内的数字即为引用计数,圆圈即为对象

浙公网安备 33010602011771号