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

96 阅读2分钟

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

性能优化及自动内存管理

性能优化能带来用户体验的提升,降低成本提升效率。 性能优化可以从两个层面进行优化,如业务层优化,语言运行时优化等。相比业务层优化的具体问题具体分析,语言运行时优化更有通用性。但不管是何种角度都应该做到有数据驱动的想法。

01. 自动内存管理

自动内存管理管理的是动态内存. 而自动内存管理可以利于程序员关注于业务逻辑的代码实现,避免手动内存管理,保证了内存使用的正确性。

其有三个任务 1. 为新对象分配空间 2.找到存活对象 3.找回死亡对象的内存空间。其中Mutator执行1的操作,collector执行2,3的操作。

则有几个评价GC算法的指标,如安全性(不能回收活对象),吞吐率(花在GC上的时间),暂停时间,内存开销等。

有两种非常常见的垃圾回收技术:追踪垃圾回收 和 引用计数。

在追踪垃圾回收时,要用什么标记和清理策略要根据不同对象生命周期进行分析,可以利用分代GC的假说,年轻代存活对象较少可以采用copying collection的方式,而老年态存活校多则可存在mark-sweep collection的方式。

在引用计数时,给每个对象有一个关联的引用,当且仅当引用计数大于0时,对象才能存活。

02. Go内存管理及优化

go 内存分配蕴涵了分块,缓存的方式。其存在问题,对象分配非常高频,小对象占比高,GC内存分配占时高。 而balanced GC做法则是利用GAB进行管理,并在GAB超过一定阈值时,将GAB中存活的对象复制到另外分配的GAB上。

03. Go编译器优化

现状:采用的优化少,编译时间短,并且没有进行复杂的代码优化和分析。 beast mode方法, 如以下两点:

(1) 函数内联: 将调用函数的函数体的副本替换到调用位置上, 同时重写代码以反映参数的绑定

(2) 逃逸分析: 分析代码指针的动态作用阈,及指针在何处可以被访问