Go语言优化 | 青训营笔记

115 阅读2分钟

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

Go语言优化

性能优化的两个层面:业务层、语言运行层(√)

Go SDK产品优化建议

保证软件质量

保证接口稳定的前提下改进具体实现

测试用例要覆盖尽可能多的场景(测试驱动开发)

用户文档清晰(做了什么、没做什么、优化的效果)

优化代码的隔离性(通过选项控制是否开启优化)

可观测性(日志输出)

正文

内存管理优化

自动内存管理(垃圾回收)——管理的是动态内存

动态内存是程序在运行时根据需求动态分配的内存,c语言中用malloc()

优点:避免手动内存管理、保证内存使用的正确和安全性

任务:为新对象分配空间、找到存活对象、回收死亡对象内存空间

1.线程分类

Mutator:业务线程、分配新对象,修改对象关系

Mutator:GC线程,找到存活对象,回收死亡对象内存空间

2.GC算法

Serial GC:只支持一个Collector

Parallel GC:支持多个Collector同时回收

Concurrent GC:Mutator、Collector双线程可以同时执行(重点:需要感知对象指向关系的变化)

算法评价指标安全性吞吐量:花在GC上的时间、暂停时间:stop the world(STW)业务是否感知、内存开销

3.GC技术

1)追踪垃圾回收

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

步骤:标记根对象、找到可达对象、清除不可达对象

根据对象的生命周期使用不同的标记和清理策略

2)引用计数

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

存活条件:引用数大于0

优点:内存管理的操作在程序执行过程被顺带着完成了、不需要了解runtime实现细节

缺点:原子操作开销大、无法回收环形数据结、内存开销大、回收可能存在暂停

go内存管理机制

编译器优化

编译器和静态分析

优化的基本问题和思路