在分析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引用的对象

网友评论