Andriod内存泄漏的几种工具和方法

来源:互联网 发布:淘宝买iphone7可靠吗 编辑:程序博客网 时间:2024/05/02 00:32

Android应用内存泄漏检测

Android内存泄漏方法介绍以及实例分析(如果看不见图片,可以下载附件查看) http://pan.baidu.com/s/1o7VKtMq

先简单介绍下内存泄漏,Android为什么会有内存泄漏的出现,简单科普一下。

        Android是Java语言编写,与C或者C++不同,Java的几乎所有内存对象都是在堆内存上分配(基本数据类型除外),然后由GC(garbage collection)(垃圾回收机制)负责自动回收不再使用的内存,牛逼的地方就在这里,GC会自动回收不再使用的内存?那么为什么java还会有内存泄漏的情况发生,其实仔细斟酌一下会发现,GC会自动回收“不再使用”的内存,那么什么情况下GC才认定这块内存是不再使用的,这才是问题的关键。

Java中对内存对象的访问,使用的是引用的方式。在Java代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间,GC线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果GC线程通过这种方式,无法跟踪到某一块堆内存,那么GC就认为这块内存将不再使用了。

举个例子,看如下一段简单的代码

Main:
Object o1 = new Object()
Object o2 = new Object()
o2=o1

 

执行上述代码,heap中的obj2没有引用关系指向它,此时GC认为这就是可以被回收掉的内存空间

那么,什么才是内存泄漏?简单的说,就是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的引用。(不用了,却不能被GC。)

【背景】
本文将主要针对 杭州公交App 进行内存泄漏测试介绍。

【测试工具】
DDMS/Android studio/adb命令辅助查看

【测试方法】
手机内存资源相当紧张,内存泄漏最直接的表象就是操作了一阵子之后,内存持续飙涨,是OOM(内存溢出----直接导致应用无响应或崩溃)的主要贡献者,所以我们不允许内存泄漏情况的发生,内存会持续飙涨?这不正是我们给我们排查内存泄漏提供了一个初期的调查方法嘛

所以,你可以用下面的方法排查内存泄漏问题,为了让童鞋们更好的完成一个项目内存泄漏的测试,接来下我将逐步给大家演示:

第一种测试方法:使用Andriod studio进行测试(我最常用的方法)

1.    安装studio,具体的安装步骤这里不做详细描述,百度一下,你就知道。

2.    配置JDK和SDK环境

3.    使用数据线连接电脑和Android手机,打开studio,然后在手机上打开要测试的应用,(可以顺便看看log日志),主要是点击Monitors,界面如下:

4.    接下来我们就做一次内存检测的完整步骤,先分别点击这个两个按钮。(前提是我觉得APP在这个界面存在内存泄露了,我才点击。具体怎么觉得的,请往下接着看)

 

5.    点击之后你会看见这样的图。

然后会看见这样文件:

 

看见之后点击右边的 “Analyzer Tasks”,然后再点击

 

这是没有内存泄漏的情况,下面来一个有内存泄露的,童鞋们看看有什么不同:

是不是多了一个leaked Activities 呢~这就是可能出现的内存泄漏的分析结果。给开发看看吧,他们会知道为什么出现了内存泄漏的。

 

 

 

第二种测试方法:使用DDMS进行测试

1.打开DDMS:

2.    操作前后请GC几次,去除weak/soft reference的干扰,软弱引用在内存紧缺时会被GC主动释放掉,所以,第一步,选择你的应用,做GC操作。

2, update heap操作,点击如下按钮



3, 提前制定好你的测试场景,做闭环操作(闭环操作,GC几次之后,理论上内存会回归到操作之前的水平,如果操作过后,内存涨的明显,则说明有内存泄漏风险),内存变化可以从这里看到,你可以只关注Allocated 的变化。

第三种测试方法,ADB命令辅助测试

    输入 adb shell dumpsys meminfo packagesname(包名),会得到如下图结果

 

通过不断打开,关闭某界面,查看他的Activity的数量是否上涨(当关闭后,应该是只有当前一个Activity的),如果只涨,不降,基本上来说就泄露了。

 

【结束语】

本文给大家介绍了下android内存泄漏的测试思路和测试方法,当然最重要的还是要学会如何避免内存泄漏的产生了解内存泄漏的实质原因,然后将测试方法配合使用。

有什么地方描述不正确的,请指正。

 

1 0
原创粉丝点击