Go语言内存管理详解 | 青训营笔记

57 阅读2分钟

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

0、前言:

本节课程的重点内容:

  • 自动内存管理
  • Go 内存管理及优化
    • 内存分配
    • 内存管理优化
  • 编辑器和静态分析
    • 基本介绍
    • 数据流和控制流
    • 过程内和过程间
  • Go 编译器优化

1、内存管理

作用:

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

概念

  • Mutator:业务线程,分配新对象,修改对象指向关系
  • Collector:GC线程,找到存活对象,回收死亡对象的内存空间,且必须感知对象指向关系的改变
  • Serial GC 和 Parallel GC collector 都要暂停,Serial 只有一个 collector
  • Concurrent GC 可同时执行 mutator 和 collector
  • 吞吐率 1 - ( GC / 程序执行时间 )

垃圾回收

标记根对象 --- 标记可达对象 --- 根据对象生命周期选择不同的标记和清理策略

其他

  • Young generation

    • 对于存活对象少,可采用 copying collection
    • 吞吐量高
  • Old generation

    • 对于趋向于一直活着,反复复制开销大
    • 采用 mark-sweep collection

2、Go内存管理及优化

Go 内存分配 -- 分块,缓存

  • 根据对象大小,选择合适的块返回
  • 多级缓存
  • 清理完成之后会先加入缓存,根据策略交还给os

Balanced GC

设计三个指针:base (初始位置),end (分配大块的内存),top (当前使用的位置)

if top + size <= end{
    addr := top
    top += size
    return addr
}

使用copying GC算法来实现内存清理

3、编辑器和静态分析

结构

(前端)词法分析->语法分析->语义分析->中间代码生成->(后端) 代码优化->代码生成

静态分析

不执行代码,推导行为进行分析 (控制流,数据流)

过程间分析

  • 通过数据流分析得知具体类型
  • 根据具体类型,产生新的控制流

4、Go编译器优化

函数内联