这是我参与「第四届青训营 」笔记创作活动的第4天
1.内存回收的两种思路:
- RC:引用计数法,指的是对一个对象的引用进行计数,多一个引用者,就+1,少一个就-1,为0就释放,典型的比如IOS的swift就使用RC进行内存管理。其中引用计数法容易造成循坏引用的问题,所以引入了弱引用和手动标记,需要程序员自行对自己的内存进行管理。
- GC:垃圾回收,通过可达性分析算法判定这个对象是否存活。这个算法的基本思路是从GC-ROOTS的根对象作为起始节点集中根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”,如果某个对象到GC ROOTS间没有任何引用链相连,则证明该对象是不可能再被使用的。
2.谈谈引用
- 强引用:只要强引用关系还存在,就不会回收。
- 软引用:只有内存满的时候,才会回收。
- 弱引用:一有回收的时候就会回收。
- 虚引用:形同虚设。
3.生存还是死亡
在进行可达性分析后,发现该对象不可达到GC ROOTS,那么就会进行第一次标记。然后看该对象重写finalize()方法没,若没有则回收。若有,那么就执行,若还是不可达,那么回收,反之不回收。需要注意的是,finalize()只能执行一次。
4.GC ROOTS是什么?
栈、static变量、native ref、vm 保留的对象,切记,宾语是对象。
5. 内存回收
- 标记清除:对垃圾直接进行回收
- 标记整理:在标记清除的基础上对内存进行一次整理
- 标记复制:内存分为俩部分,把有用的对象拷贝到另一个区域,然后集中释放掉当前区域的内存。
6.ART的做法
- 前台GC:tracing gc,速度:快。
前台GC采用tracing gc的原因是,有用的比较多,所以不用过多的去搬对象。
- 后台GC: copying gc,速度:慢。
后天GC采用copying gc的原因是,有用的对象比较少,所以进行搬移对象统一回收内存很方便。