青训营day5 Go语言性能优化 | 青训营笔记

64 阅读2分钟

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

一、本堂课重点内容

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

二、详细知识点介绍

1 自动内存管理

  • 评价GC算法
    • 安全性:不能回收存活的对象
    • 吞吐率:花在gc的时间上要少
    • 暂停时间:尽可能低
    • 内存开销
  • 追踪垃圾回收
    • 标记:找到可达对象
    • 清理:所有不可达对象
      • Copying GC:将存活对象复制到另外的内存空间
      • Mark-sweep GC:将死亡对象的内存标记为“可分配”
      • Mark-compact GC:移动并整理存活对象
    • 根据对象的生命周期,使用不同的标记和清理策略
  • 分代GC
    • 年轻代
      • 常规的对象分配
      • 由于存活对象很少,可以采用复制策略
    • 老年代
      • 通常采用清扫策略
  • 引用计数:引用数大于0,对象才可存活

2 Go内存管理及优化

  • Go内存分配
    • 分块:根据对象大小,选择合适的块
    • 缓存:每个p包含一个mcache用于快速分配,用于为绑定于p上的g分配对象
  • Go内存管理优化
    • Balanced GC

3 编译器和静态分析

  • 编译器结构
    • 分析部分:词法分析、语法分析、语义分析、中间代码生成
    • 综合部分:代码优化、代码生成
  • 静态分析:不执行程序的代码,推导程序的行为,分析性质

4 Go编译器优化

  • 函数内联
    • 将被调用函数的函数体副本替换到调用位置上
    • 优点:降低函数调用开销
    • 缺点:函数体变大
  • 逃逸分析
    • 分析代码中指针的动态作用域,将未逃逸的对象在栈上分配
    • 标量替换

三、课后个人总结

  • 本次学习对内存分配,内存回收有了系统的了解,建立了初步的知识框架
  • 对于GC的具体策略和具体使用场景还不是很理解,需要加强

四、引用参考

blog.csdn.net/weixin_4356…