性能优化及自动内存管理|青训营笔记

81 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

主要内容:go语言优化、go自动内存管理

性能优化

性能优化:提高软件的处理能力,减少不必要的消耗,充分发掘计算机算力。从而提高用户体验,资源高效利用,降低成本。

性能优化的层面:

业务层优化:针对特定场景,具体问题,容易获得较大性能收益。

语言运行时优化:解决通用的性能问题,考虑更多场景。

数据驱动:使用自动化性能分析工具pprof,依靠数据而不是猜测,首先优化最大瓶颈。

自动内存管理

保证内存使用的正确性和安全性。

任务:为新对象分配空间,找到存活对象,回收垃圾对象。

GC类型:serial GC 、parallel GC 、 Concurrent GC。

评价GC算法:

  • 安全性:不能回收存活的对象,基本要求
  • 吞吐率
  • 暂停时间
  • 内存开销

追踪垃圾回收

追踪垃圾回收的流程:标记根对象、找到可达对象、清除所有不可达对象。

根据对象的生命周期来选择不同的分配回收算法。

每个对象可以设置一个年龄,每经过一次GC年龄加一,根据年龄的大小采用不同的策略。 对于年龄小的,我们使用copying collection方法。对于年龄大的我们使用mark-sweep GC方法。

引用计数

每个对象都有一个与之相关联的引用数目,对象存活条件,当且仅当引用数大于0.

优点:内存管理的操作被平摊到程序执行过程中。

缺点:维护引用开销大,无法回收唤醒数据结构,回收内存仍然可能引发暂停。

Go内存分配

分块 mspan:8KB

多级缓存:mcache、mcentral、mheap。

对象分配是非常高频的操作,小对象占比更多。

go内存分配的路径太长了。

Balanced GC

GAB:将多个小对象合并成一个大对象分配。问题:可能导致对象延迟释放。

使用指针碰撞风格的对象分配。

静态分析

控制流分析:程序执行的流程。

数据流分析:数据在控制流上的传递。

过程内分析:尽在函数内部进行分析。

过程间分析:考虑过程调用时参数传递和返回值的数据流和控制流。

go编译器优化

现状:采用的优化少,编译时间短,没有进行较复杂的代码分析和优化。

优化:函数内联、逃逸分析