如何确定内存回收
引用计数算法
如下例:
Object obj = new Object(); //obj的引用计数+1 = 1
obj = null; //obj的引用计数-1 = 0(此时引用计数为0,对象会被回收)
Object o1 = new Object(); //o1的引用计数+1 = 1
Object o2;
o2 = o1; //o1的引用计数+1 = 2
o1 = null; //01的引用计数-1 = 1(此时引用计数不为0,对象不会被回收)
当一个对象引用计数为0的时候才会进行回收,互相引用容易出现计数器永不为0
可达性分析算法
Android中使用可达性分析算法来确定内存回收
当对象与GC Root之间的引用链断开的时候这个对象就会被系统回收,如上图中的ObjF与ObjD跟ObjE都会被回收
堆
Young Generation 年轻代
新实例化的对象会存放在年代中的Eden Space里面,GC之后,就会在整理(去除了内存碎片)之后放入From Space中,然后下一次GC将Eden跟From Space整理后放在To Space中,再下一次则是又放入From Space中,依次循环
Old Generation 老年代
多次GC后(超过阈值)青年带中还没有被回收的数据就会放入老年代中