Android 内存泄露神器之LeakCanary

随着我们项目的不断完善,有一天突然发现性能出现在了我们面前,随之而来的就有内存泄漏、内存溢出等概念

先介绍一下内存溢出,即应用某一时刻所占有的内存超过所申请的内存,发生了内存溢出,OOM(OUT OF MEMORY )。

内存泄露呢,就是类持有外部类实例对象的引用,垃圾回收机制就回收不了该对象,所产生的现象。

今天主要讲讲如何检测内存泄露,导致内存泄露的原因有很多,比如:

1.cursor用完后没有关掉

2.输入输出流用完后没有关掉

3.注册对象为注销,如registerReceiver,但没有调用unregisterReceiver

4.bitmap使用后没有recycle

5.static关键字的不当使用

6.context的使用

7.adapter没有复用convertView等等

那么如何避免内存泄露呢?

也就是对以上原因一一对应解决

那如何检测是否发生内存溢出了呢,这里就用到了一个神器:LeakCanary,一个开源项目,

原理:创建一个RefWatcher,启动一个ActivityRefWatcher,通过ActivityLifecycleCallbacks把Activity的onDestroy生命周期关联,最后在线程池中分析内存泄漏。

使用方法:1、在moudle工程下的build.gradle加入依赖

 

debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'

 

在我们的application中onCreate方法中进行初始化

 

mRefWatcher=LeakCanary.install(this);

 

大功告成,就这么简单,不要怀疑,哈哈

 

当我们调用install时,会默认安装一个Leaks的apk,这个就是检测内存泄漏的,如果发生泄露了,这个apk中会有记录,打开它会告诉你详细信息,同时在泄露十秒左右,通知栏也会告诉你发生泄露了

还有一点需要注意的是,以上这么写默认是只检测activity的,如果想检测Fragment,Service,BroadcastReceiver等有生命周期的,需要在onDestroy中获取到RefWatcher然后调用watch()方法

 

mRefWatcher.watch(this);

 

当然如果想自己将泄露信息传到服务器,然后再根据具体内容进行解决,可以自定义处理结果

 

 

   //1 自定义服务
        class MyLeakService extends DisplayLeakService{
            @Override
            protected void afterDefaultHandling(HeapDump heapDump, AnalysisResult result, String leakInfo) {
                super.afterDefaultHandling(heapDump, result, leakInfo);
                //heapDump:堆内存文件,可以拿到完成的hprof文件 使用MAT分析
                //result:监控到内存的状态,如是否泄漏
                //leakInfo:leak trace详细信息,除了内存泄露对象,还有设备信息
		//在这里可以将这些信息上传到服务器
            }
        }
        //2在manifest中注册服务
        
        //3在App中install
        LeakCanary.install(this,MyLeakService.class);  //1 自定义服务
        class MyLeakService extends DisplayLeakService{
            @Override
            protected void afterDefaultHandling(HeapDump heapDump, AnalysisResult result, String leakInfo) {
                super.afterDefaultHandling(heapDump, result, leakInfo);
                //heapDump:堆内存文件,可以拿到完成的hprof文件 使用MAT分析
                //result:监控到内存的状态,如是否泄漏
                //leakInfo:leak trace详细信息,除了内存泄露对象,还有设备信息
		//在这里可以将这些信息上传到服务器
            }
        }
        //2在manifest中注册服务
        
        //3在App中install
        LeakCanary.install(this,MyLeakService.class);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值