这是我参与「第五届青训营 」伴学笔记创作活动的第 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实现细节
缺点:原子操作开销大、无法回收环形数据结、内存开销大、回收可能存在暂停