在分析Android内存泄漏之前,先了解一下JAVA的一些知识
1. JAVA中的对象的创建
使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象
垃圾回收器回收非存活的对象,并释放对应的内存空间
2.Java如何判定对象存活或死亡?
可达性分析算法
1给对象中添加一个引用计数,假如为count
2当引用这个对象时:count++
3当count==0时:对象处于,也就是说没有其它地方在引用这个对象了,对象就处于“死亡”状态,回收对象可达性分析算法
举个例子:像找人一样,A认识B,B认识C,C认识D,那么A就要吧通过这样的关系认识D,如果能找到D,说明D对象是存活的,不能回收,如果通过所有的关系都找不到D,说明D是“死亡”的,回收D对象。
可达性分析算法的定义:通过一系列的称为 GC
Roots 的对象作为起点,从这些节点开始向下搜索,搜索把走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连(就是从GC Roots 到这个对象不可达)时,则证明此对象是不可用的。如下图,Object5,Object6,Object7就是不可达对象,是要被回收的对象
问:哪些对象可以作为GC Roots对象呢?
1虚拟机栈中引用的对象
2方法区中类静态属性引用的对象
3方法区中常量引用的对象
4本地方法栈中JNI引用的对象