Golang 笔记3【语言优化】 | 青训营笔记

128 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记

内存管理优化

业务层优化 针对特定问题进行分析(pprof),具体问题具体分析

语言运行时优化 go-sdk:解决通用问题,内存分配等

数据驱动优化:依靠实际数据,进行数据优化,优先解决最大性能瓶颈

注意点: 1.保证接口稳定 2.测试覆盖尽可能多的场景 3.保证优化隔离性,日志记录

自动内存管理

管理动态内存malloc() 自动内存管理(垃圾回收) 主要任务:分配空间,寻找存活对象,回收垃圾对象内存

Serical GC Parallel GC Concurrent GC:业务线程与垃圾回收同时进行,必须能够知道对象指向关系的改变 GC算法评估:安全性,吞吐量(GC占用时间),暂停时间,内存开销

追踪垃圾回收:标记根对象(全局变量,栈中对象),找到可达对象,清理不可达对象(复制清理,标记清理,整理清理)

分代垃圾回收:年轻代(复制),老年代(标记,对象较大,复制开销大)

引用计数:记录每个对象有几个其他对象引用它

内存分配

对象分配:提前将内存分块,根据对象大小返回合适大小的块。(不包含指针的对象不需要GC扫描) 缓存:thread caching

内存管理优化: 小对象分配:Balanced GC,三个指针(base,end,top),分配对象时top指针后移,将多个小对象的分配合并为一个大对象的分配 内存延迟释放问题:移动GAB中的存活对象(复制GC,小对象)

静态分析

不执行代码,推导程序的行为与性质 控制流:执行流程(控制流图) 数据流:数据在控制流上的传递 分析代码性质,优化代码

过程内分析:考虑函数内部 过程间分析:考虑函数之间参数调用

编译器优化

函数内联:将函数副本替换到调用位置上,降低函数调用开销,过程间转化为过程内 函数体变大,编译生成的镜像变大,设置合适内联策略 逃逸分析:分析指针作用域,是否传递到当前作用域外 Beast mode:未逃逸对象分配在堆上