高性能 Go 语言发行版优化与落地实践(上)| 青训营笔记

128 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记


内存优化是什么

优化软件系统处理能力,提高软件运行效率,减少不必要的消耗,提升用户体验。

性能优化方法论

1.数据驱动:使用自动性能分析工具pprof,依靠数据而非猜测,抓住关键点
2.业务层优化:具体问题具体分析,容易获得性能收益
3.运行时优化:考虑更多场景,解决普遍性的问题

认识垃圾回收器

垃圾回收器是公共语言运行时组件,用于控制托管堆中内存的分配与释放。 开发人员不必手动释放内存,托管堆中的对象便于管理,保证内存使用的正确性与安全性。

垃圾回收机制

  1. 搜索托管代码中引用的对象 。
  2. 尝试完成未引用的对象。
  3. 释放未引用的对象并回收其内存。

实现原理 内存管理:进程初始化时,会保留一个连续的地址空间区域,称之为托管堆。托管堆维护着一个指针,指向为下一个对象分配内存的地址,初始的指向为基址,其中包含所有类型的引用。第一个对象创建时,垃圾回收器会在基址分配内存,这之后创建的对象分配到的内存都会紧跟在这地址之后。

内存回收:垃圾回收器通过检查应用程序的根来确定不再使用的对象并回收其内存

1. 自动内存管理

1.1相关概念

Mutator:业务线程,负责分配对象以及修改对象指向关系
Collector:GC线程,回收死亡对象内存
serial GC:只支持一个collector
parallel GC:支持多个collectors同时运行
Concurrent GC:mutator和collector可以同时运行 collectors需要感知对象指向关系的变化,go中采用 三色标记法

  • 评价GC算法的指标 安全性:不能回收存活的对象
    吞吐率:1-gc时间/总时间
    暂停时间(STW):业务是否感知
    内存开销:GC元数据开销

1.2追踪垃圾回收

从根对象(全局变量,静态变量,常量,线程栈)出发,标记所有指针关系可达的对象,释放指针关系不可达的对象。

  • 清理策略(根据对象生命周期,使用不同的标记和清理策略)
  1. Copying GC:将存活对象复制到另外的内存空间
  2. Mark-sweep GC:将死亡对象标记为可分配(free list)
  3. Mark-compact GC:移动并整理存活对象(原地整理)

1.3分代GC

依据对象生命周期划分年轻代和老年代,分别采用copying GC 和 Mark-sweep GC

1.4引用计数

  • 每个对象都有与之关联的引用数目,引用数目为0标记为死亡对象 说说缺点(维护开销大,无法回收环形数据结构,依然可能引发暂停)