Android虚拟机垃圾回收笔记 | 青训营笔记

97 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第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的原因是,有用的对象比较少,所以进行搬移对象统一回收内存很方便。