Golang初识5 | 青训营笔记

81 阅读3分钟

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

上节课重点介绍了GO项目在业务和基础库上的优化,今天的重点承接上节课的内容,并深入Go语言的一些优化方向。

性能优化

Why:性能优化在提升用户体验和降低系统开销都能发力,同时对于拥有大量子服务模块的大型公司来说,语言层面的优化是可以累计的,优化策略被用到整个公司的全部项目上节省的资源是很客观的,所以我们需要做更深入的优化。

What:性能优化的核心是减少没有必要的浪费,充分利用现有资源,所以优化的前提是建立在系统本身就是较高质量的软件系统,鲁棒性不符合标准的系统可能会因为过于低层的优化导致更多的Bug。

优化层面:业务层面,语言运行时优化(包含基础库上的优化与SDK等更底层的语言相关的优化)。

内存管理

内存管理部分的主要内容和在操作系统课程上也有类似的动态调整内存的算法,因为他们处理问题的思路是类似的,只是考虑问题的层级不一样, 语言的自动内存管理,主要是为了减轻程序员开发的负担,主要的内容就是安排新的,找到活的,清理死的

Mutator与Collector

go语言的线程有业务线程Mutator和内存管理线程Collector,根据两者不同的执行关系又分为:

1.Serial GC:只有一个Collector, 需要Pause

2.Parallel GC:多个Collector, 需要Pause

3.Concurrent GC:Collector和Mutator可以同时执行,不需要专门pause

由于并发处理的存在,所以需要我们的GC算法可以动态的感知对象的状态,进行合适的内存回收。

GC算法的评价标准:安全性(不能回收该存在的内存)、吞吐率(占用的时间少)、暂停时间(STW不能影响业务的体验)、内存开销(元数据开销)。常见基础算法:TGC(追踪垃圾回收), RC(引用计数)。

TGC

追踪垃圾回收的主要过程:标记根对象,标记可以通过根对象到达的对象,清理所有不可到达的对象(CopyingGC, Mark-SweepGC, Mark-CompactGC, 灵活的通过系统使用的对象的特征进行选择)

分代 GC

根据对象存在的时间长短进行分代(不同的内存块),采取不同的GC策略,基于大部分对象都是die young的特点。年轻的采取复制GC,老的采用Mark-SweepGC。

RC

引用计数的优点:相比TGC与运行时环境的耦合度低,时间开销比较低。缺点:环形引用怎么回收的问题,引用数的原子操作引入的时间复杂度,所有的对象都有额外的内存开销,回收大型结构的时候仍然会有STW的问题。