Android Studio检查内存泄漏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QQ243223991/article/details/52586929

1、前言

在Android Studio没有出来之前,们普遍使用eclipse来进行开发,在开发的旅程中也会遇到发生内存泄漏的情况,我们可以利用MAT来进行内存检测,查出具体导致内存泄漏的原因。而如今,这个时代已经成为历史,在火遍全世界的今天,Android Studio成为了Android开发的驱使者,我们必须顺应时代的改变来学习并使用新的开发工具。从使用Android Studio以来,相信我们都已经知道了它的基本使用,当然,使用了Android Studio后,我们也逃脱不了内存泄漏这一厄运给我们带来的灾难,因此,利用Android Studio来分析内存的使用情况,以及查出具体导致内存发生泄漏的原因也是我们开发者必须要掌握的一个知识点了,我在此仅将自己所理解和掌握的做一个笔记,如果读者在阅读中发现有错误之处,望予批评和评论纠正,在此先谢谢大家!

2、正文

首先来看一个例子:这里只是部分代码,该代码是在MainActivity中。

private int time=0;

private  Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if(msg.what==0){
                time++;
                tvTime.setText("time的值为:"+time);// tvTime为TextView控件
                handler.sendEmptyMessageDelayed(0,1000);
            }
        }
    };
由以上这几行代码看来,大家都知道,这种Handler的使用方法存在一个弊端,在我们运行后再log中也会提示一个错误"The following Handler class should be static or leaks might occur: xxxx",为什么会出现这样一个提示呢,我们可以去看一下Handler的内部原理Handler剖析,这个我们就不去做过多的讲解,因此以来,我们跑一下这个程序,然后退出。接下来打开我们的内存使用情况查看工具,位于Android Monitor中,点击开有两个栏目位,一个是我们使用最多的log日志栏,另一个则是查看内存,cpu,网络,和GPU的工具栏,如图:

内存使用情况

①:代表内存使用情况

②:当前CPU使用情况

③:当前网络状况

④:GPU情况

当我们来回退出再次进入多次时,会发现Allocated值在不断上升,且在Activity回收后内存并没有明显的回收,其中①为当前内存使用情况,②为空闲的空间,如图:


最后上升到了8.2M左右,从原来的7.5M上升,虽然说这里看似没有多大影响,但是在我们不断操作或者有大量代码可能存在这样的安全隐患时,你就该担心你的APP的存活率了,我们知道,发生内存泄漏就会导致卡死,即ANR,系统会则会杀死该进程,这样的结果并不是开发者需要的。

我们接着看,是什么原因导致了内存在不断增加呢?看看具体操作:

第一步:进入待检测的Activity或者是整个app应用

第二步:获取我们检测片段的Dump Java Heap


第三步:开始分析



第四步:得出结果



为什么会出现这么多MainActivity呢?原因是我们进入了多少次就会获取多少个。

其次,在Reference Tree中就可以明显的看到一行蓝色的信息,这个即为发生内存泄漏的地方。这个和MAT工具检测的一模一样,我们点击展开查看详细信息,得到如图:


从图中可以初步定为到target中的信息为Message处发生了内存泄漏,因此我们就大概可以从Handler入手处理。问题就这样排查出来了。然我们接下来解决一下这个内存泄漏的问题。我们在用static来修饰一下Handler,至于为什么这样处理,可以查阅一下Handler机制及其使用,修改以后重新检测,发现不再有内存泄漏了。到这里内存检测的学习算结束了,如果能给你带来一点收获,不要忘记支持一下哦。

猜你喜欢

转载自blog.csdn.net/QQ243223991/article/details/52586929