Go语言优化(day4)| 青训营笔记

63 阅读2分钟

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

image.png

1.内存管理优化

1.背景知识:自动内存管理和Go内存管理机制

1.自动内存管理(垃圾回收):本质是管理动态内存,由程序语言的运行时系统管理。用来保证内存使用的正确性和安全性。
2.一些相关概念的介绍(摘自青训营老师的ppt): image.png

image.png 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的负担。)

3.推荐阅读的技术博客

程序猿学Go:内存管理 - 知乎 (zhihu.com)

动图图解GC算法 - 让垃圾回收动起来! - 码农参上 - 博客园 (cnblogs.com)

Golang的分代GC(Garbage Collection) - 简书 (jianshu.com)