这是我参与「第五届青训营」伴学笔记创作活动的第4天
1.内存管理优化
1.背景知识:自动内存管理和Go内存管理机制
1.自动内存管理(垃圾回收):本质是管理动态内存,由程序语言的运行时系统管理。用来保证内存使用的正确性和安全性。
2.一些相关概念的介绍(摘自青训营老师的ppt):
3.GC算法的挑战和评价指标:
安全性(最起码的要求,不能回收存活的对象,否则就是出错了)
吞吐率(花在GC上的时间不能占程序运行总时间的太多)
暂停时间(中间暂停的时间不能被业务所感知到,也就是说,不能太长)
内存开销(额外开辟的内存不能太多)
4.常见GC技术:追踪垃圾回收、分代GC、引用计数
2.Go内存管理及优化
1.Go内存分配:
分块思想(将内存分为不同大小的块,根据对象需要何种大小,返回最合适的大小的块)
缓存思想(多层缓存,便于对象分配时,迅速找到空闲块)
2.Go内存分配优化:
特点(小对象多、频率高、耗时)
优化方案:Balanced GC(每个g绑定一大块内存GAB,用GAB分配小对象,三个指针,维护头、尾、中间。其本质是将许多小对象合成大对象进行分配,缺点是会导致内存延迟释放。解决方法:移动对象 copying GC)
2.编译器优化
1.背景知识:编译器优化的基本问题和思路
1.为什么优化(不需要用户感知即可获得性能收益、通用性优化,面向各种环境)
2.现状(优化少、编译时间短,没时间去进行各种优化和代码分析)
2.Go编译器优化
1.Beast mode:
函数内联(inline)(直接把函数的代码复制到调用处,消除调用的开销)(性能提升4倍多)(缺点是函数体变大、编译器生成的GO镜像变大。但整体上分析,是利大于弊)
逃逸分析(分析代码中指针的动态作用域,观察指针有没有逃逸出当前作用域。我们的优化通过内联使逃逸减小,对分配很有好处且降低了GC的负担。)