Android内存泄漏

169 阅读2分钟

可达性分析算法中,通过一系列的gc root为起始点,从一个GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点。 java中可作为GC Root的对象有   1.虚拟机栈(本地变量表)中正在运行使用的引用   2.方法区中静态属性引用的对象   3. 方法区中常量引用的对象 4.本地方法栈JNI中引用的对象(Native对象) 上图中objD与objE到GC ROOT不可达,所以可以被回收。而其他的对gc root可达。

内存泄漏原因是:长生命周期的对象拥有短生命周期对象的引用,本该回收的对象因为引用问题无法回收。

内存泄漏常见原因: 1、集合类
2、静态成员,常量
3、单例模式
4、未关闭释放的资源
5、Handdler/Thread 非静态内部类

内存泄漏排查: 步骤1:

步骤2:

进入app后到处多点几次,可以使用monkey测试。

步骤3 4:

步骤5:这里我们知道哪几个对象存在内存泄漏的问题

步骤6:使用SDK工具platform-tools/hprof-conv.exe 把 a.hprof 编译为 a_mat.hprof

步骤7:使用Eclipse插件打开a_mat.hprof 下载链接:https://www.eclipse.org/mat/downloads.php

步骤8:
步骤9:

步骤10:

步骤11:在AS中AddfriendActivity中查看关于BaseApp的引用

然而AddFriendActivity中代码并没有找到有关BaseApp,继续BaseActivity中找
MyApp 继承BaseApp

步骤12:解决问题

内存泄漏排查和修复就到这里,更多的是需要自己细心去找。