4性能优化内存管理| 青训营笔记

81 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第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编译器优化