Android 使用LeakCanary 检测内存泄露

LeakCanary 是 Android 和 Java 内存泄露检测框架,该框架是Square公司的一个开源库,项目地址 leakcanary

Android 开发中你是否频频遇到内存泄露而无奈无从解决。说不定哪天你不小心写的一行代码就导致了内存泄露。可以先看看这些问题导致的内存泄露 Android开发编码规范导致的内存泄露问题,而LeakCanary 则很直白得检测出了内存泄露并展示给我们。在使用它之前,我们来写一个例子。

本地广播,在开发中还是有一定的应用的,现在有这么一个需求,要求使用本地广播来实现,就是通过发送一个退出程序的本地广播,所有Activity接收到后就退出,这显然是需要一个基础的Activity,其他Activity继承它。为了方便,这里我们只使用一个Activity。

public class MainActivity extends AppCompatActivity {
    public final static String ACTION_EXIT_APP = "cn.edu.zafu.leakcanary.exit";
    private static LocalBroadcastManager mLocalBroadcatManager;
    private BroadcastReceiver mExitReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(ACTION_EXIT_APP)) {
                Log.d("TAG", "exit from broadcast");
                finish();
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(ACTION_EXIT_APP);
        filter.addCategory(Intent.CATEGORY_DEFAULT);
        getLocalBroadcastManager().registerReceiver(mExitReceiver, filter);
    }

    private  LocalBroadcastManager getLocalBroadcastManager() {
        if (mLocalBroadcatManager == null) {
            mLocalBroadcatManager = LocalBroadcastManager.getInstance(this);
        }
        return mLocalBroadcatManager;
    }

}

乍一看,是不是感觉写的很对啊,那你就不够细心了,这还是少量的代码,对于项目中日积月累的代码,内存泄露或许无处不在。我们使用LeakCanary 对我们的代码进行检测下,看看到底哪里发生了内存泄露,以及该如何解决。

使用方法也很简单,首先加入依赖

debugCompile ‘com.squareup.leakcanary:leakcanary-android:1.3.1‘
releaseCompile ‘com.squareup.leakcanary:leakcanary-android-no-op:1.3.1‘

从依赖中也是可以看出猫腻的。

然后在我们程序的Applictaion中进行安装,当然,不要忘记在清单文件中注册该Application。

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        LeakCanary.install(this);
    }
}

我说就这么简单你会信,好了,我们安装到手机上看看。安装完成后运行该软件,打开后退出该软件,这时候你发现桌面上多了一个Leaks的图标。

打开它后通知栏会有一个通知,通知你发生了内存泄露

然后在软件里你会看到内存泄露的跟踪信息。

点击下方的delete可以删除此条信息。

仔细一看,原来是我们的mLocalBroadcatManager发生了泄露,注册本地广播的时候,传入了this,系统内部保持了这个引用,当我们退出Activity时,这个引用还是指向我们的Activity,导致Activity回收失败。那么怎么解决了,既然退出的时候还持有引用,那么我们取消注册这个广播这个引用不就没了吗,重写onDestroy方法,进行取消注册。

@Override
protected void onDestroy() {
    super.onDestroy();
    getLocalBroadcastManager().unregisterReceiver(mExitReceiver);
}

重新运行一下,咦,你发现内存不再泄露了。该软件里不再提示内存泄露的跟踪信息了。

就是这么简单,如果想更进一步了解使用方法,比如检测Fragment有没有泄露。可以参考官方给的例子,并且内存泄露的跟踪信息也是可以上传到服务器的,更多内容,参考 leakcanary

源码下载

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 04:06:56

Android 使用LeakCanary 检测内存泄露的相关文章

Android实战——LeakCanary检测内存泄漏

本篇文章包括以下内容: 前言 内存泄漏的简介 内存溢出的简介 LeakCanary的配置与使用 结语 内存泄漏对于初学者们可能是一个陌生的词语,但是却频频发生于自己的软件上,只不过自己不知道而已.同理,内存溢出也是一个道理.而内存泄漏和内存溢出常常是面试的考题,所以早点掌握是必不可少的 内存泄漏是指:对象在它有限的生命周期结束时,它们将被垃圾回收,如果在回收时,这个对象还被一系列的引用,导致该对象不会被回收,那么就会导致内存泄漏.随着泄漏的累积,应用将消耗完内存,应用的流畅性就会大大减弱 常见的

使用LeakCanary检测内存泄露 翻译

原文:https://academy.realm.io/cn/posts/droidcon-ricau-memory-leaks-leakcanary/ GitHub:https://github.com/square/leakcanary Nov 18 2015 目录 中文翻译介绍 (0:00)内存泄漏:非技术讲解 (1:40)LeakCanary 救援 (3:47)技术讲解内存泄漏 (8:06)分析堆 (10:16)LeakCanary 救你于水火 (12:04)LeakCanary API

Android 源码系列之<十四>从源码的角度深入理解LeakCanary的内存泄露检测机制(下)

转载请注明出处:http://blog.csdn.net/llew2011/article/details/52958567 在上边文章Android 源码系列之<十三>从源码的角度深入理解LeakCanary的内存泄露检测机制(中)由于篇幅原因仅仅向小伙伴们讲述了在Android开发中如何使用LeakCanary来检测应用中出现的内存泄露,并简单的介绍了LeakCanary的相关配置信息.根据上篇文章的介绍我们知道LeakCanary为了不给APP进程造成影响所以新开启了一个进程,在新开启的

Android 源码系列之&lt;十三&gt;从源码的角度深入理解LeakCanary的内存泄露检测机制(中)

转载请注明出处:http://blog.csdn.net/llew2011/article/details/52958563 在上篇文章Android 源码系列之<十二>从源码的角度深入理解LeakCanary的内存泄露检测机制(上)中主要介绍了Java内存分配相关的知识以及在Android开发中可能遇见的各种内存泄露情况并给出了相对应的解决方案,如果你还没有看过上篇文章,建议点击这里阅读一下,这篇文章我将要向大家介绍如何在我们的应用中使用square开源的LeakCanary库来检测应用中出

使用新版Android Studio检测内存泄露和性能

内存泄露,是Android开发者最头疼的事.可能一处小小的内存泄露,都可能是毁于千里之堤的蚁穴.  怎么才能检测内存泄露呢?网上教程非常多,不过很多都是使用Eclipse检测的, 其实1.3版本以后的Android Studio 检测内存非常方便, 如果结合上MAT工具,LeakCanary插件,一切就变得so easy了. 熟悉Android Studio界面 工欲善其事,必先利其器.我们接下来先来熟悉下Android Studio的界面  PHPer月薪测试题 [点击进入] 看看自己工资拿少

Android Studio检测内存泄露和性能

韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha [email protected] 首先需要明白一个概念, 内存泄露就是指,本应该回收的内存,还驻留在内存中. 一般情况下,高密度的手机,一个页面大概就会消耗20M内存,如果发现退出界面,程序内存迟迟不降低的话,可能就发生了严重的内存泄露. 我们可以反复进入该界面,然后点击dump java heap 这个按钮,然后Android Studio就开始干活了,下面的图就是正在dump  dump成功后会自动打开 hprof文件,

深度分析内存泄漏原因,使用MAT工具检测内存泄露和性能

造成内存泄漏原因: 场景一:静态变量导致的内存泄漏 例如:mainactivity中 private static context scontext: @override protected void oncreat(bundle savedinstancestate){ ............................................. scontext=this; } 泄漏点:静态变量scontext引用,activity无法正常销毁 场景二:单例模式导致的内存泄漏

[Android Memory] App调试内存泄露之Context篇(下)

转载地址:http://www.cnblogs.com/qianxudetianxia/p/3655475.html 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncTask等系统自带类去做事情,当然无可厚非. 但是AsyncTask确实需要额外注意一下.它的泄露原理和前面Handler,Thread泄露的原理差不多,它的生命周期和Activity不一定一致. 解决方案是:在activity退出的时候,终止AsyncTask中的后台任务. 但是,问题是如

[Android Memory] App调试内存泄露之Context篇(上)

转载自:http://www.cnblogs.com/qianxudetianxia/p/3645106.html Context作为最基本的上下文,承载着Activity,Service等最基本组件.当有对象引用到Activity,并不能被回收释放,必将造成大范围的对象无法被回收释放,进而造成内存泄漏. 下面针对一些常用场景逐一分析. 1. CallBack对象的引用 先看一段代码: @Override protectedvoid onCreate(Bundle state){ super.o