Go语言性能优化及内存管理 | 青训营笔记

80 阅读2分钟

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

性能优化

性能优化是什么?简单来说,性能优化就是提升系统处理能力,减少不必要的消耗,充分发掘计算机能力。 为什么要做性能优化?主要有两点原因:第一,增强用户的体验感;第二,高效利用系统资源,降低成本,提高效率。

性能优化的层面主要有两个:业务层优化以及语言运行时的优化。

业务层优化

针对特定场景,做到具体问题具体分析,容易获得较大的性能收益。

语言运行时优化

解决更通用的性能问题,涉及到的场景更广泛。

自动内存管理

评价GC算法

安全性:不能回收存活的对象

吞吐率:1 - GC时间/程序总执行时间

暂停时间:业务是否感知

内存开销:GC元数据开销

追踪垃圾回收

. 对象被回收的条件 : 指针指向关系不可达的对象

. 标记根对象:静态变量、全局变量、常量、线程栈等

. 清理:所有不可达对象、将存活的对象复制到另外的内存分配空间;将死亡的对象内存标记为“可分配”;移动并整理存活对象

image.png

分代GC

. 分代假说

. 每个对象都有年龄:经历过GC次数

. 对年轻和老年的对象,指定不同的GC策略,降低整体的内存管理的开销

. 不同年龄的对象处于heap的不同区域

年轻代:常规的对象分配,GC吞吐率很高

老年代:对象趋向于一直活着,反复复制开销较大

引用计数

. 每个对象都有一个与之关联的引用数目

. 对象存活的条件:当且仅当引用数大于0

. 内存管理的操作被平摊到程序执行过程中

. 内存管理不需要了解runtime的实现细节

缺点有:

. 维护引用计数的开销较大:通过原子操作保证对引用计数操作的原子性和可见性

. 无法回收环形数据结构

. 内存开销:每个对象都引入的额外的内存空间存储引用数目

. 回收内存时依旧可能引发暂停

优化方案

Balanced GC

. GAB对于Go内存管理来说是一个对象

. 本质:将多个小对象的分配合并成一次达对象的分配

. 问题:GAB的对象分配方式会导致内存被延迟释放

. 方案:移动GAB的存活对象

包括:

当GAB总大小超过一定阈值时,将GAB中存活的对象复制到另外分配的GAB中

原先的GAB可以释放,避免内存泄漏

本质:用copyong GC 的算法管理小对象

image.png

image.png