这是我参与「第五届青训营 」笔记创作活动的第4天
回顾
高质量编程 编码规范 性能优化建议
性能优化 pprof 业务 基础库 go语言优化
优化 内存管理 编译器
背景 自动内存管理 go内存管理机制 编译器优化基本问题和思路
性能优化是什么 提升软件系统处理能力 减少不必要消耗
为什么要做 用户体验 资源高效利用:降低成本,提高效率
性能优化的层面 业务代码 SDK 基础库 语言运行时 OS
业务层优化 特定场景
语言运行时优化 更通用性能问题 考虑更多场景
数据驱动 pprof 依靠数据而非猜测 首先优化最大瓶颈
性能优化与软件质量 保证接口稳定前提下改进 测试用例:覆盖尽可能多场景,方便回归 文档:做了什么,没做什么,达到怎样效果 隔离:通过选型控制是否开启优化 可观测:必要的日志输出
总结 性能优化 2基本问题 两个层面 业务 语言运行时 可维护性 质量
1自动内存管理
Tracing garbage collection Generation GC Reference counting
动态内存 malloc() 自动内存管理(垃圾回收):系统管理动态内存 避免手动管理内存,专注实现业务逻辑 保证内存使用的正确性和安全性
三个任务 为新对象分配空间 找到存活对象 回收死亡对象的空间
Concurrently Mutator threads
Mutator:业务线程 Collector:GC线程 Serial GC:只有一个collector Parallel GC:支持多个collector同时回收 Concurrent GC:mutators和colllectors可同时执行 Collecors必须感知对象指向关系的改变
评价GC算法 安全性 基本要求 吞吐率 花在GC上的时间 暂停时间 业务是否感知 内存开销 GC元数据开销
追踪垃圾回收 引用计数
1.2追踪垃圾回收
对象被回收的条件 标记根对象 标记:找到可达变量 清理:所有不可达对象 Copying GC Mack-sweep GC Mark-compact GC 原地整理对象
根据对象生命周期
1.3分代GC Generational GC 分代假说 年龄:经历过GC的次数 目的:制定不同GC策略 减少内存开销
年轻代 存活对象少 copying collection
老年代 对象趋于一直活着 反复复制开销较大 mark-sweep collection
1.4引用计数 对象存活条件:当且仅当引用数大于0 优点 内存操作被平摊到程序执行过程中 不需要了解runtime的实现细节c++智能指针 缺点 原子操作 原子性 可见性 无法回收环形数据结构 weak reference 内存开销:引入额外内存空间 回收内存时依然可能引发暂停
总结 背景意义 概念评价方法 追踪垃圾回收 引用计数 分代GC
2go内存管理及优化
3编译器和静态分析
4go编译器优化