go语言中如何进行性能优化等操作| 青训营笔记

43 阅读2分钟

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

  1. 为了进行系统处理能力、减少不必要的消耗,挖掘计算机算力,达到以较低资源实现较高的性能
  2. 性能优化方面主要从以下角度进行:
  • 业务层优化:结合场景具体问题具体实现
  • 语言运行时的优化
  • 解决性能问题
    
  • 考虑不同场景下的运行性能
    
  • 工具Tradeoffs
    
  • 数据驱动方面:
  • 利用性能分析工具:PPROF
    
  • 结合实验数据分析优化
    
  • 优化最大瓶颈
    
  1. 自动内存管理
  • 系统运行时自动对内存进行管理:大致分为以下方面:
  • 新对象分配空间
    
  • 找到存活对象
    
  • 回收死亡对象的内存空间
    
  1. 相关概念介绍:
  • Mutator:分配新对象,修改对象之间的关系
  • Collector:GC线程,找到存活对象,回收死亡对象的内存
  • Serial GC:只有一个Collector
  • Parallel GC:支持多个Collector运行回收内存
  • Concurrent GC:Mutator和Collector可以同时运行,但Collector必须感知对象之间的关系,避免在后续回收内存时出现错误
  1. 评价gc算法的指标:
  • 安全性:对存活对象不能进行回收
  • 吞吐率:1-GC运行时间/系统运行时间
  • 暂停时间:业务是否感知
  • 内存开销:GC元数据开销
  1. 常见的GC算法:追踪垃圾回收和引用计数
  • 追踪垃圾回收:
  • 对象回收的条件:指针关系不可达对象
  • 从根对象开始标记(全局变量、局部变量、常量、线程栈),标记所有可达对象,将未被标记的进行清除,清除方式有:
  • 存活对象移动到另一个内存空间
    image.png
  • 死亡对象标记为可分配 image.png
  • 移动整理存活对象 image.png
  • 分代gc
  • 很多对象再分配出去以后不再使用,根据使用次数定义新旧对象,
    
  • 新对象一般是刚分配,且使用次数不多,将新对象复制到另一个空间合适
    
  • 旧对象使用次数多,可以使用标记法
    
  • 引用计数:
  • 每个对象都有一个自己被引用的数目
    
  • 存活条件:被引用的次数>0
    

image.png 6. 内存管理与优化

  • 为对象在heap上分配内存
  • 提前将内存进行分块
  • 步骤如下:
  • 调用mmap()向os预先申请内存
    
  • 将申请到的内存进行分块, mspan
    
  • 将分块后的内存分为特定大小的块
    
  • noscan mspan:分配不包含指针的对象
    
  • scan mspan:分配包含指针的对象
    
  • 对象分配:根据对象大小,分配合适的块