GC笔记

157 阅读1分钟

如何确定内存回收

引用计数算法

如下例:

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后(超过阈值)青年带中还没有被回收的数据就会放入老年代中