go语言内存管理 | 青训营笔记

62 阅读2分钟

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

本堂课重点内容:

  • 自动内存管理
  • go内存管理以及优化
  • 编译器静态分析
  • go编译器优化

详细知识点介绍:

性能优化:

性能优化主要针对以下几个层面:

  • 业务层优化

    针对特定的场景进行优化,例如一个功能使用一些算法进行实现,降低时间复杂度,比较容易获得较大的性能收益

  • 运行时优化

    优化的范围更广泛,即使优化的幅度不大,但许多程序都能用到该优化综合起来也是很大的性能节约

  • 根据运行结果优化

    依靠pprof工具进行的优化,找到程序占用资源较多的地方进行优化,从而使得程序有更好的时间复杂度与空间复杂度。注意,要在保证接口稳定的情况下改进接口实现。

GO语言的自动内存管理

  • 分块

先申请一大块内存,然后划分大块,然后再划分成特定大小的小块

分配时:根据对象大小选择最合适的块

  • 内存管理优化

对象分配是非常高频的操作。对大公司来说,每秒或许分配GB级别的内存

内存较小的对象占比较高

所以go的内存分配比较耗时

  • 字节内部的优化方案 Banlanced GC

    • 每个g都绑定一大块内存,

    • GAB用于noscan类型的小对象分配

    • 使用三个子还真维护GAB:base基址 end 结束地址 top当前地址

    • 指针碰撞风格的对象分配

      • 不需要和其他请求互斥

      • 分配动作简单且高效

编译器静态分析

  • 不执行代码,通过推导程序的行为来分析程序的性质

  • 控制流: 程序的执行流程

  • 数据流: 数据在控制流上的传递

  • 编译器静态分析: 通过分析控制流和数据流进行编译优化,通过分析最后可能的结果,然后根据结果进行代码的优化。

Go编译器的优化

  • 优点: 重新编译即可获得性能收益,覆盖面积广,对性能的提升多

  • 缺点: 编译时间延长

总结

这两节课总结了一些编译优化的方法,对go语言的性能调优有了一定的理解。总体的知识偏概念性。凭感觉来说,这里的优化已经比较底层,相关的知识可能会到挺久之后才能用到。希望到时候我再回来看到这篇文章,能够重新看一遍视频,获得新的收获。