Go内存管理|青训营笔记

43 阅读2分钟

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

内存管理

性能优化

性能优化是什么?

  • 提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力

为什么要做性能优化?

  • 用户体验:带来用户体验的提升
  • 资源高效利用:降低成本,提高效率

性能优化的层面

  • 业务层优化
    • 针对特定场景,具体问题具体分析
    • 容易获得较大的性能收益
  • 语言运行时优化
    • 解决更通用的性能问题
    • 考虑更多场景
    • Tradeoffs
  • 数据驱动
    • 自动性能分析工具--pprof
    • 依靠数据而非猜测
    • 首先优化最大瓶颈

自动内存管理

  • 动态内存
    • 程序在运行时根据需求动态分配的内存:malloc()
  • 自动内存管理(垃圾回收):有程序语言的运行时系统管理动态内存
    • 避免手动内存管理,专注于业务逻辑的实现
    • 保证内存使用的安全性与正确性:double-free problem, use-after-free problem

自动内存管理相关概念

  • mutator:业务线程,分配新对象,修改对象指向关系
  • Collector:GC线程,找到存活对象,回收死亡对象的内存空间
  • Serial GC: 只有一个collector
  • Parrallel GC:支持多个Collectors同时回收的GC算法
  • Concurrent GC: mutators和collectors可以同时执行

image.png

如何评价GC算法

image.png

垃圾回收

image.png

分代GC

image.png

引用计数

image.png

分块

目标:为对象在heap上分配内存

提前将内存分块:调用系统调用mmap(),向OS申请一大块内存;将其划分成大块,称作mspan,再将大块分成特定大小的小块,用于对象分配,根据对象的大小,选择最合适的块返回。小块有两种类型,

  • noscan mspan:分配不含指针的对象,GC不需要扫描

  • scan mspan:分配含指针的对象,GC需要扫描

image.png

缓存

GMP模型中,每个p包含一个mcache用于快速分配,用于为绑定于p上的G分配对象;mcache管理一组mspan

image.png

Balanced GC

每个G都绑定一大块内存(1KB),称作 goroutine allocation buffer(GAB)

GAB用于noscan类型的小对象分配:<128 B

GAB对于Go内存管理来说是一个对象。

image.png