这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天.
性能优化
性能优化是什么?简单来说,性能优化就是提升系统处理能力,减少不必要的消耗,充分发掘计算机能力。 为什么要做性能优化?主要有两点原因:第一,增强用户的体验感;第二,高效利用系统资源,降低成本,提高效率。
性能优化的层面主要有两个:业务层优化以及语言运行时的优化。
业务层优化
针对特定场景,做到具体问题具体分析,容易获得较大的性能收益。
语言运行时优化
解决更通用的性能问题,涉及到的场景更广泛。
自动内存管理
评价GC算法
安全性:不能回收存活的对象
吞吐率:1 - GC时间/程序总执行时间
暂停时间:业务是否感知
内存开销:GC元数据开销
追踪垃圾回收
. 对象被回收的条件 : 指针指向关系不可达的对象
. 标记根对象:静态变量、全局变量、常量、线程栈等
. 清理:所有不可达对象、将存活的对象复制到另外的内存分配空间;将死亡的对象内存标记为“可分配”;移动并整理存活对象
分代GC
. 分代假说
. 每个对象都有年龄:经历过GC次数
. 对年轻和老年的对象,指定不同的GC策略,降低整体的内存管理的开销
. 不同年龄的对象处于heap的不同区域
年轻代:常规的对象分配,GC吞吐率很高
老年代:对象趋向于一直活着,反复复制开销较大
引用计数
. 每个对象都有一个与之关联的引用数目
. 对象存活的条件:当且仅当引用数大于0
. 内存管理的操作被平摊到程序执行过程中
. 内存管理不需要了解runtime的实现细节
缺点有:
. 维护引用计数的开销较大:通过原子操作保证对引用计数操作的原子性和可见性
. 无法回收环形数据结构
. 内存开销:每个对象都引入的额外的内存空间存储引用数目
. 回收内存时依旧可能引发暂停
优化方案
Balanced GC
. GAB对于Go内存管理来说是一个对象
. 本质:将多个小对象的分配合并成一次达对象的分配
. 问题:GAB的对象分配方式会导致内存被延迟释放
. 方案:移动GAB的存活对象
包括:
当GAB总大小超过一定阈值时,将GAB中存活的对象复制到另外分配的GAB中
原先的GAB可以释放,避免内存泄漏
本质:用copyong GC 的算法管理小对象