这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
自动内存管理是什么?
程序在运行时会动态的根据需求来分配内存,如C语言中的malloc(),针对这块动态内存进行管理的系统,就叫自动内存管理,或者垃圾回收系统(Garbage Collection/GC)。
自动内存管理有哪些任务
- 为新对象分配空间
- 找到存活对象
- 回收死亡对象的内存空间
自动内存管理的基本运行逻辑
假定一个程序有两种线程,一种是业务线程(mutator),一种是GC线程。在业务线程的间隙,就会插入GC线程,来进行GC,然后再继续业务线程,GC线程时间一般非常短,让我们感知不到它的存在。
几种gc线程的执行方式
每次mutator暂停都由一条gc线程来进行垃圾回收处理
每次mutator都由多条gc线程处理,还是需要暂停mutaor线程
无需暂停mutator线程,可以在某段时间内同时处理两种线程的工作。
哪种执行方式会是比较好的呢?又或者我们怎样去综合使用。
要做出评价,就需要有一个评价的衡量标准。gc算法会从下面几种指标来衡量
-
安全性:不会把存活的对象也回收
-
吞吐率:花在gc上的时间要尽量少
-
暂停时间:暂停的时候业务是否感知
-
内存开销:GC元数据开销 简述垃圾回收算法
-
追踪垃圾回收
-
引用计数
追踪垃圾回收
- 在内存的几个区域(栈,堆,全局),标记根对象
- 根据根对象指针,找到所有可达对象
- 清理:所有不可达对象都应该被清理掉。
标记根,根据跟指针来寻找可达对象,可以想象成从树根开始搜索树的过程。
清理的几种方式方法
- -copy GC
- -Mark-sweep GC
- -Mark—compact GC copy GC和Mark-compact GC类似,前者是复制到另外的内存空间,后者是复制到现有的内存空间起点,进行整合,避免碎片内存。而Mark-sweep GC则是用链表维护好零碎清理掉的空间,进行再分配。
不同的对象应该使用不同的清理方式策略。分代GC就是很好的例子。
引用计数
-
前提:每个对象都会有一个关联的引用数目
-
清理条件:对象引用数为0
-
优点:
程序会在运行的执行中同时对对象进行清理,且不需要知道runtime的实现细节
-
缺点:
- 内存开销,每个对象需要额外空间存储数目
- 维护计数开销较大:需要原子操作
- 无法回收环形结构等..