GO性能优化和内存管理 | 青训营笔记

74 阅读2分钟

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

一、性能优化

1.1 优化层面

1.1.1 业务层优化

  • 特定场景,具体分析
  • 易获得较大收益

1.1.2 语言运行时优化

  • 更通用的性能问题:内存分配、编译器优化

1.1.3 数据驱动

  • 自动化性能分析工具:pprof
  • 依靠数据而非猜测

二、自动内存管理

概念

  • 动态内存:程序运行时根据需要动态分配的内存
  • 自动内存管理(垃圾回收):程序运行时由系统回收动态内存

追踪垃圾回收

  • 回收条件:指针指向不可达的对象
  • 回收流程:
    • 标记根对象:静态变量、全局变量、常量、线程栈。这些是在程序运行时都可能使用的。
    • 标记可达对象:从根对象出发,找到所有可达对象,要根据指向对象找到传递闭包。
    • 清理所有不可达对象:
      • Copying GC:把原来的内存空间中的标记对象copy到另一块内存空间
      • Mark-sweep GC:把非存活对象内存标记为可分配
      • Makr-compact把存活对象移动至内存空间的开头

根据不同的生命周期使用不同的策略

根据对象经历GC次数,分为年轻和老年对象,分别放在不同heap区域,制定不同的GC策略

  • 年轻代

    • 常规对象分配,生命周期不长,内存大小偏小,可以直接copy
    • copying GC
  • 老年代

    • 因为生命周期长,反复复制开销大,采用Mark-sweep GC

GO内存管理及优化

内存分配

分块

为了方便为对象分配最合适的内存,程序会先向OS申请一大块内存,然后分成大块(mspan),再按块细分为特定大小的小块。

缓存

申请内存流程:g -> m -> p -> mspans -> mcentral image.png