App 内存应用的内存泄露检测及应用中哪个方法耗时的检测

来源:互联网 发布:黑客技术软件网盘 编辑:程序博客网 时间:2024/05/21 15:02
App 内存应用的内存泄露检测及应用中哪个方法耗时的检测

导致内存泄漏常见情况:
1.静态变量的使用(静态变量直接或间接地引用了Activity对象就会造成内存泄漏)
2.Activity定义成了静态变量
3.Activity中使用了静态的 View (View 会持有Activity的对象引用)
4.ImageSpan引用了 Activity Context
5.单例引用了 Activity Context
6.线程(包括 AsyncTask)的使用:Activity 退出后线程还在运行, 并且线程中使用了Activity或View对象;
7.Handler 对象的使用: Activity退出后 Handle r仍有消息要处理;
8.广播接收者没有注销;服务没有解绑;游标关闭,流关闭
9.在Activity中创建了非静态内部类(内部类中直接或间接引用到了Activity)的静态变量
10.静态集合保存的对象没有及时清除;(LeakCanary 分析不了,使用 DDMS 及 MAT)

内存泄露检擦
1.使用第三方开源项目 LeakCanary
使用方式
添加依赖:
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
Application中初始化:
public class ExampleApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化 LeakCanary
        if (LeakCanary.isInAnalyzerProcess(this)) {
            return;
        }
        LeakCanary.install(this);
        // Normal app init code...
    }
}
2.通过 DDMS 和 MAT 工具分析,操作步骤如下:
内存泄露在 “静态集合保存的对象没有及时清除” 该情况时,使用 LeakCanary 检擦不出,得用 DDMS 和 MAT 工具分析。
 通过 DDMS(或者 AS 的 monitor  ->  memery 窗口)发现问题:通过 AS 中的 Monitor 窗口进行分析,查看内存分配情况,如果操作应用时内存一直往上涨说明可能存在内存泄漏。
通过MAT定位问题: 使用 Memory Analyzer tool(MAT)
用法:
 1.点击 update Heap(左上角 第二个按钮,虫子右边)。
 2.点击 Heap。
 3.打开你要检测的应用,然后不停地折腾(一个界面一个界面的测试),偶尔点 Cause GC 一下
 4.测试了一段时间,自己感觉差不多后,导出 .hprof  文件(点击左上角第三个按钮:dump HPROF file),
然后在该文件目录下打开 dos 窗口,输入 hprof-conv a.hprof b.hprof 命令对 hprof文件进行处理, 再用 MAT 打开该文件进行分析。
优化性能:
 使用 TraceView 对性能分析
 TraceView: ddms中的一个分析工具,使用方式 start method profiling 开始跟踪 stop method profiliing 结束跟踪,
按方法调用消耗时间的降序排列,分析耗时较多的方法是否有优化的空间;