在主流的商用程序语言中(Java和C#),都是使用可达性分析算法判断对象是否存活的。这个算法的基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,下图对象object5, object6, object7虽然有互相判断,但它们到GC Roots是不可达的,所以它们将会判定为是可回收对象。
在java语言里,可作为GC roots 对象的包括如下几种:
a 虚拟机栈(栈桢中的本地变量表)中的引用的对象
b方法区中的常量引用的对象
c方法区中的常量引用的对象
d本地的方法栈中jni的引用对象
节选自《深入理解java虚拟机》
使用leakcanary检测泄漏
leakcanary使用注意
leakcanary和代码示例说明内存泄露
案例一:静态成员促成的内存泄露
测试内部类持有外部类引用,内部类是静态的(GC-ROOT,将一直连着这个外部类实例),静态的会和Application一个生命周期,这会导致一直持有外部类引用(内部类隐含了一个成员变量$0), 即使外部类制空= null,也无法释放。
OutterClass
TestActivity