这是我参与[第五届青训营]笔记创作活动的第4天 本文主要想对课堂上一些知识点进行记录总结。今天所学的是go的内存管理。
一、本堂课重点内容:
- 自动内存管理
- go的内存管理及优化
二、详细知识点介绍:
自动内存管理
1.概念及背景
背景
自动内存管理是由程序语言的运行时系统管理动态内存,让程序员避免手动管理内存,专注于实现业务逻辑。同时保证内存使用的正确性和安全性(如 double-free problem 和 use-after-free problem )
自动内存管理:
- 为新对象分配空间
- 找到存活对象
- 回收死亡对象的内存空间
概念
- Mutator:业务线程
- Collector:GC线程
- Serial GC:只有一个collector,执行时暂停mutator
- Parallel GC:可以有多个collectors同时进行回收,执行时暂停mutator
- Concurrent GC:可以同时执行mutator和collector
评价GC算法的一些指标:
- 安全性:GC不能回收存活对象
- 吞吐率:1-GC时间/程序执行总时间
- 暂停时间:业务暂停的时间
- 内存开销:GC的内存开销
常见GC技术
追踪垃圾回收
在追踪垃圾回收中对象被回收的条件是指针指向不可达的对象。
追踪垃圾回收可分为三步:
- 标记根对象(静态变量、全局变量、常量、线程栈等)
- 找到所有可达对象(从根对象出发,根据指针指向方向去寻找)
- 清理所有不可达对象(Copying GC、Mark-sweep GC、Mark-compact GC)
可以使用分代GC以降低整体内存管理开销
引用计数
对象存活条件是当且仅当引用数大于0,其内存管理被平摊到程序的执行过程中去,且内存管理不需要了解runtime的实现细节