这是我参与「第五届青训营 」伴学笔记创作活动的第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编译器优化
函数内联