这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
1. 今日学习内容
今天主要学习了性能优化相关的概念,以及自动内存管理方面的概念和算法、Golang的内存管理和编译器相关的优化等。本篇笔记主要记录和自动内存优化相关的内容。
2. 自动内存管理
2.1 基本概念
- 动态内存
- 程序在运行时根据需求动态分配的内存
- 自动内存管理(垃圾回收)
- 由程序语言运行时系统管理动态内存
- 避免手动管理内存,专注于实现业务逻辑
- 保证内存使用的正确性和安全性
- 相关名词
- Mutator:业务线程,分配新对象,修改对象指向内容
- Collector:GC线程,找到存活对象,回收死亡对象的内存空间
- Serial GC:只有一个collector
- Parallel GC:支持多个collectors同时回收
- Concurrent GC:mutatior和collector可以同时执行
2.2 评价指标
- 安全性:不能回收存活对象的基本要求
- 吞吐率:花在GC上的时间
- 暂停时间:业务是否感知
- 内存开销:GC元数据开销
2.3 追踪垃圾回收
- 对象被回收条件:指针不可达的对象
- 工作:
- 标记根对象
- 静态变量、全局变量、常量、线程栈等
- 标记:找到可达对象
- 求指针指向关系闭包,从根对象出发,找到所有可达对象
- 清理:清理所有不可达对象
- Copying GC:将存活对象复制到另外的内存空间
- Mark-sweep GC:将死亡对象的内存标记为可分配
- Mark-compact GC:移动并整理存活对象
- 标记根对象
2.4 分代 GC
- 分代假说很多对象在
- 分配出来后很快就不再使用了
- 每个对象都有年龄:经历过GC的次数
- 目的:针对年轻和老年对象,制定不同GC策略
- 不同年龄的对象处于heap的不同区域
2.5 引用计数
- 每个对象都有一个阈值关联的引用计数
- 对象存活条件:当且仅当引用数大于0
- 优点:
- 内存管理的操作被平摊到程序执行过程中
- 内存管理不需要了解runtime的实现细节(如C++智能指针)
- 缺点:
- 维护引用计数开销大
- 无法回收环形数据结构
- 回收内存时依然可能引发暂停