解决android 内存泄漏

一、常见的内存泄漏场景及其常见的解决方案

  • 常见的内存泄漏场景:

    1、单例设计模式造成的内存泄漏
    2、非静态内部类创建的静态实例造成的内存泄漏
    3、Handler造成的内存泄漏
    4、线程造成的内存泄漏
    5、资源未关闭造成的内存泄漏

  • 常见的解决方案(思路)

    1、尽量使用Application的Context而不是Activity的漏
    2、使用弱引用或者软引用漏
    3、手动设置null,解除引用关系漏
    4、将内部类设置为static,不隐式持有外部的实例漏
    5、注册与反注册成对出现,在对象合适的生命周期进行反注册操作。漏
    6、如果没有修改的权限,比如系统或者第三方SDK,可以使用反射进行解决持有关系
    7、在使用完BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源时,一定要在Activity中的OnDestry中及时的关闭、注销或者释放内存,

二、使用leakcanary   定位并解决内存泄漏问题

使用方法

1.引入相关包

dependencies { debugCompile 'com.squareup.leakcanary:leakcanary-android:1.6.1' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1' }

2.在application 中注册

if (LeakCanary.isInAnalyzerProcess(this)) {

      // This process is dedicated to LeakCanary for heap analysis.

     // You should not init your app in this process. return;

}

LeakCanary.install(this);其返回值就是RefWatcher,可用于单独监测某一个类的内存泄漏问题

(解释一下为什么要先判断LeakCanary.isInAnalyzerProcess(this)

在注册之前先判断LeakCanary是否已经运行在手机上,比如你同时有多个APP集成了LeakCanary,其他app已经运行了LeakCanary则不需要重新install)

补充可以用LeakCanary监听指定对象的内存泄漏

 如果想让LeakCanary监听指定对象的内存泄漏,我们就需要使用到RefWatcherwatch功能

用法:获取到application 中install 的返回值,然后在需要监测的类中的oncreate中调用RefWatcher().watch(this);即可。

3.内存泄漏问题暴露入口

(1)在notification 中会有提示

(2)桌面上生成一个Leaks的图标,这个就是展示内存泄漏列表的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值