go内存管理及性能与编译优化 | 青训营笔记

92 阅读2分钟

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

一、本堂课重点内容:

  • 性能优化
  • 自动内存管理
  • 编译器和静态分析
  • 编译器优化

二、详细知识点介绍:

  • 性能优化

    性能优化可以提升软件处理系统的能力,使资源高效利用并提升用户体验。

    性能优化的层面:

    • 业务层优化:针对特定场景,具体问题,具体分析;比较容易获得较大的性能收益
    • 语言运行时优化:解决更通用的性能问题;考虑更多场景
  • 自动内存管理

    通过自动内存管理(垃圾回收),我们可以避免手动释放内存,将注意力专注在业务逻辑实现。
    GC相关名词:

    • Mutator:业务线程,分配新对象,修改对象指向关系;
    • Collector:GC 线程,找到存活对象,回收死亡对象的内存空间;
    • Serial GC(串行 GC):只有一个 collector;
    • Parallel GC(并行 GC):支持多个 collectors 同时回收的 GC 算法;
    • Concurrent GC(并发 GC):mutator(s) 和 collector(s) 可以同时执行

    对GC算法的评价因素:

    • 安全性:不能回收存活的对象 (基本要求)
    • 吞吐率:计算公式:1 - GC时间 / 程序执行总时间
    • 暂停时间:垃圾回收导致业务线程挂起(暂停)的时间(stop the world, 简称STW)
    • 内存开销:GC元数据开销
  • 追踪垃圾回收

    go目前使用到的垃圾回收算法

    基本步骤: 标记根节点 -> 标记可达对象 -> 清除不可达对象

    如果采用并行GC,会出现在标记的同时又插入新节点,为了避免新加入的节点被当作未标记节点而被清除掉,可以采用三色标记。

  • 分代GC

    看参照JVM,分年轻代和老年代

  • 内存管理

    • 分块
    • 缓存
    • 优化
      • 对象分配是非常高频的操作:每秒分配GB级别的内存
      • 空间较小的对象占比比较高
      • Go内存分配比较耗时(分配路径长:g -> m -> p -> mcache -> mspan -> memory block -> return pointer)
      • 字节跳动解决方案: Balanced GC
  • 编译器优化

    • 函数内联
    • 逃逸分析

三、课后个人总结:

有效的分析和优化能对程序运行有较好的性能提升;go的自动垃圾回收机制使我们可以专心于代码业务逻辑的实现。

四、引用参考:

字节内部课: 高性能 Go 语言发行版优化与落地实践