高性能go与内存管理 | 青训营笔记

31 阅读2分钟

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

追求性能

什么是性能优化? 性能优化是提升软件效率,减少不必要消耗
为什么要做呢? 可以让刷抖音更思华,双十一不卡顿

性能优化有以下几个层面

  • 业务层优化
  • 语言运行优化

优化是考数据驱动的,也就是pprof,首先优化最大的性能瓶颈

软件质量只管重要,需要保证接口稳定的情况下,改进具体实现. 文档应该记录 做了什么,什么没做,能达到什么样的效果. 还应该实现可观测这一点,也就是有必要的日志输出

自动内存管理

动态内存是程序运行时动态的内存分配,也就是malloc()
垃圾回收,是语言运行时管理动态内存

  • 可以让我们专注于业务逻辑
  • 保证安全性和准确性

自动内存管理的核心任务是

  • 为新对象分配空间
  • 回收死亡对象
  • 寻找存活对象

名词定义:

  • Mutator: 代表业务线程,分配新对象
  • Collector: GC线程,寻找存活对象,回收死亡对象空间

GC类型:

  • Serial GC, 单线程GC
  • Parallel GC. 多线程gc(多个collector同时回收)
  • Concurrent GC, 内存的分配和回收并行

GC

评价GC算法有以下方法

  • 安全性, 不能回收存货的对象
  • 吞吐率, 花在gc上的时间
  • 暂停时间
  • 内存开销

一般回收的条件是指针指向不可达的对象

垃圾回收遵循以下步骤

  • 标记根对线, 比如全局变量,静态变量
  • 找到可达对象,从根对象出发,找到所有可达的对象
  • 清理不可达对象

清理不可达对象有以下几种方法

  • 将存活对象复制到另外的内存空间
  • 将死亡对象的内存标记为可分配
  • 移动并整理存活对象

分代GC: 对每一个对象标记有年龄,年龄是对象经过GC的次数, 对老的对象和年轻的对象 进行不同的GC策略.
老的对象,偏向一直活着,复制开销较大, 采用mark-sweep 新的对象,存活对象很少, 采用copy collection算法