这是我参与「第五届青训营 」伴学笔记创作活动的第6天,开始的开始除了准备学习相关的知识,还要规划好每天的日程。
过年的原因休息了很多天,今天开始要继续学习打卡啦。今天的收获主要是go语言发行版的优化以及落地实践。复习之前所学的知识,高质量编码主要是为了写出高性能易于维护的代码,对于性能优化方面,学习了pprof工具,了解了如何使用该工具定位性能问题。今天主要是针对go语言的优化,涉及的方向主要是针对内存管理的优化以及编译器的优化。
首先是自动内存管理的基本概念与知识,程序在运行时需要动态分配的内存,也需要对分配的内存进行管理,对垃圾进行回收。在垃圾回收时需要考虑正确性与安全性。内存管理主要分为三个任务:为新对象分配空间、找到存活对象以及回收死亡对象的内存空间。
对于垃圾回收,通常有追踪垃圾回收与引用计数的方法。
追踪垃圾回收要清理所有指针指向不可达的对象,对根对象进行标记,然后找到可达对象,最后清理所有不可达对象。根据对象的生命周期,可以使用不同的标记与清理策略。清理的策略主要有copying GC、mark-sweep GC以及compact GC等,可以使用分代假说来区别年轻代与老年代对象,根据它们的特征采取效率更高的清理策略。比如年轻代存活对象很少,可以使用copying GC,老年代对象趋向于一直活着,可以使用mark-sweep GC。
引用计数的方法中,每个对象有一个应用数目,当引用数目归零时将被清理。这样做的好处是将内存管理的操作平摊到程序执行中,花费的代价较小,但是这样做的缺点是维护引用计数的开销比较大,无法回收环形数据结构等。
分配内存是非常高频的操作,go的内存分配比较耗时,字节采用了balanced GC,核心手段是通过将小对象的高频分配合并为大对象的分配来获得效率的提升。
今天的学习收获满满,明日继续。