[ Go 语言内存管理详解 | 青训营笔记 ]
这是我参与「第五届青训营」伴学笔记创作活动的第 4 天
零、前言:
记个笔记顺便(恰青豆还是有很多不完善也有可能对的地方还请大佬们指正
一、本堂课重点内容:
-
自动内存管理
- GC
-
Go 内存管理及优化
- 内存分配
- 内存管理优化
-
编辑器和静态分析
- 基本介绍
- 数据流和控制流
- 过程内和过程间
-
Go 编译器优化
- Beast mode
二、详细知识点介绍:
4.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 ccollection
4.2 内存管理优化
Go 内存分配 -- 分块,缓存
- 根据对象大小,选择合适的块返回
- 多级缓存
- 清理完成之后会先加入缓存,根据策略交还给os
Balanced GC
设计三个指针:base (初始位置),end (分配大块的内存),top (当前使用的位置)
if top + size <= end{
addr := top
top += size
return addr
}
使用copying GC算法来实现内存清理
4.3 编译器和静态分析
结构
(前端)词法分析 -- 语法分析 -- 语义分析 -- 中间代码生成 -- (后端) 代码优化 -- 代码生成
静态分析
不执行代码,推导行为进行分析 (控制流,数据流)
过程间分析
- 通过数据流分析得知具体类型
- 根据具体类型,产生新的控制流
4.4 GO编译优化
函数内联
被调用的函数的函数体的副本替换到调用位置上,同时重写代码以 反映参数的绑定