Android 内存泄漏之LeakCanary

版权声明:本文为Aile原创,若需转载请标明出处 https://blog.csdn.net/ware00/article/details/82734892

导言:
内存管理是android开发性能中重要的一环,而leakCanary是Square开源框架,是一个Android内存泄露检测库,是个优秀的
内存泄露检测工具,通过它大大降低oom的出现,提高app的质量

释义:
内存泄漏:对象在有限生命周期内还持有引用,没有被回收,并最终消耗完内存

引入:
1:build.gradle中

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

2:更改Application

public class LeakApplication extends Application {
    private static RefWatcher refWatcher;
    @Override
    public void onCreate() {
        super.onCreate();
        refWatcher= LeakCanary.install(this);
    }
}

3:在需要的地方使用,比如activity和fragment的onDestroy中,监控指定的对象

//activity和fragment中
@Override
    protected void onDestroy() {
      super.onDestroy();
      LeakApplication.getRefWatcher(this).watch(this);
    }

//指定的对象
LeakApplication.getRefWatcher(this).watch(someObjneedWatch);

方案:

1:使用单例造成的内存泄漏
原因:单例的静态特性使得单例的生命周期和应用的生命周期一样长,导致这个对象将不能被正常回收
方案:通过context.getApplicationContext()解决

这里写图片描述

2:Handler造成的内存泄漏
原因:Message持有mHandler实例的引用,mHandler又持有Activity的引用,导致该Activity的内存资源无法回收
方案:只需在onDestroy()函数中调用mHandler.removeCallbacksAndMessages(null)和mHandler=null
这里写图片描述

3:AsyncTask线程造成的内存泄漏
原因:在处理一个比较耗时的操作时,可能还没处理结束MainActivity就执行了退出操作
方案:在Activity的onDestory()方法中取消相应的任务AsyncTask.cancel()和asyncTask = null方法
这里写图片描述

4:非静态内部类创建静态实例造成的内存泄漏
原因:在MainActivity关闭的时候,内部类静态实例依然持有对MainActivity的引用
方案:将内部类改成静态内部类,不再持有对MainActivity的引用即可
这里写图片描述

5:WebView引起的内存泄漏
原因:WebView解析网页时会申请Native堆内存用于保存页面元素,当页面较复杂时会有很大的内存占用,当然还要图片
方案:使用了WebView的Activity(或者Service)放在单独的进程里和主动Kill掉进程


//第一步,放在单独的进程里
<activity
   android:name=".MainActivity5"
   android:process="com.aile.webview"/>
//第二步,置空和kill
 if (mWebView != null) {
            mWebView.pauseTimers();
            mWebView.removeAllViews();
            mWebView.destroy();
            mWebView = null;
        }
android.os.Process.killProcess(android.os.Process.myPid());

这里写图片描述

6:自定义view造成的内存泄漏
原因:view中有线程或者动画 要及时停止
方案:在onDestroy方法中将view=null

7:资源未关闭造成的内存泄漏
原因:BroadcastReceiver,ContentObserver,File,Cursor,Bitmap,动画等资源的使用,应该在Activity销毁时及时注销
方案:在onDestory中cancel()或close()方法

好,完毕

猜你喜欢

转载自blog.csdn.net/ware00/article/details/82734892