首先,说一下为什么要进行GC垃圾回收
手机内存给每个因公分配的内存都是有限的,如果频繁创建对象,而没有对无用对象进行回收的话,就会造成OOM(内存溢出)
注,内存溢出解决办法请见https://www.jianshu.com/p/bb3d8cc41234
查找那些没用的对象
这个有两种算法
第一,引用计算法,当对象创建的时候给对象设置一个引用计算器,当对象被引用的时候就+1,取消应用的时候就-1,没有引用的时候就是0。那么这些没有引用的就是垃圾回收的目标。但是,如果两个没有引用的对象相互引用的话这个算法就没有办法查找到
第二,可达性算法,就是从对象的根节点进行查找,不可达的对象即为垃圾
对没用对象进行回收
有四种算法
第一,标记清除法,分为标记阶段和清除阶段,标记阶段就是对所有需要回收的对象进行标记,清除阶段就是对标记的对象进行清除
第二,复制清除法,使用的内存可以分为两块,一块为没有使用的,一块是使用的,首先将使用区域中的存货的对象复制到未使用的内存区域,然后两者角色互换。(用空间换时间)
第三,标记压缩法,标记过后不需要立即清除,将存活的对象压缩到一端,清除边缘地区(用时间换空间)
第四,分带算法,将新创建的对象放在年轻带区域,因为年轻带回收快,所以用复制清除算法(空间换时间),当经过几次回收后仍然存活得对象就存放在老年代区域,因为老年代回收慢,所以可以用标记压缩法(时间换空间)也可以用标记清除法