引用计数
- 引用计数通过在对象上增加自己被引用的次数,被其它对象引用时加1,应用自己的对象被回收时减1,引用计数为0时,对象即可回收,
使用比较广泛,包括:ios cocoa框架,php,python等 - 优点:方式简单,回收速度快
- 缺点:
- 需要额外空间存放计数
- 无法处理循环引用(如:a.b=b b.a=a这种)
- 频繁更新引用计数降低了性能
标记-清除
- 该方法分为两步:
- 从根变量开始迭代得遍历所有被引用的对象,对能够通过遍历访问到的对象都进行”被引用“标记,
- 标记完成之后,对没有被标记的对象,进行内存回收
- 优点:解决了引用计数方式的不足
- 缺点:每次垃圾回收,都会暂停当前正在执行的程序,垃圾回收时系统响应能力降低
复制收集
- 复制收集只需要遍历一次,准备一个新空间,从根开始,对对象进行扫描,如果存在这个对象的引用,就把它复制到新空间,一次扫描后,所有不存在新空间的对象,都是可以回收的垃圾对象
标记清除和复制收集对比
- 标记清楚 节省内存,但是需要两次遍历,对于回收垃圾占比小的情况比较合适;
- 复制收集更快速需要开辟额外空间,对于垃圾占比比较大的情况下比较占优
分代收集
- 这种方式使用了程序的一种特性,大部分对象会从产生开始后,在很短时间内变为垃圾对象,而存在很长时间的对象往往有较长的时间周期
- 根据对象存活周期不同划分为新生代和老生代,存活周期短的为新生代,存活周期长的为老生代,
- 新创建的对象,被称为生代,高频对新生成的对象回收,称为小回收,低频的对老生代的回收,称为大回收,每次小回收后把存活下来的对象归为老生代,小回收的时候直接跳过老生代,
三色标记法
- 起初把所有对象标记为白色
- 从根出发,扫描所有可达的对象,标记为灰色,放入待处理队列
- 从队列取出灰色对象,将其引用对象标记为灰色放入队列,自身标记为黑色
- 重复3,直到灰色对象队列为空,此时白色对象即为可以回收的垃圾对象
网友评论