Android 程序由java语言编写,android的内存管理与java相似,通过new为对象分配内存,所有对象在java堆内分配空间,对象回收有个垃圾回收器来完成。GC就是垃圾收集的意思(Gabage Collection)。

每个Android app底层都对应一个Dalvik虚拟机,它的最大堆大小一般是16M,有的机器为24M。

也就是说我们所能利用的内存空间是有限的。如果我们的内存占用超过了一定的水平就会出现OutOfMemory的错误。

内存问题主要有两个方面:

1.程序设计中保存了多个大内存的对象(缓存设计),导致超过可用内存限制;

2.程序的错误,长期持有已经不被引用的内存对象,导致占用无谓的内存空间,造成内存泄露。

Android触发内存泄露的条件:

Android 系统中内存回收的触发点大致可分为三种情况:

1.用户程序调用 StartActivity(), 使当前活动的 Activity 被覆盖;

2.用户按 back 键,退出当前应用程序;

3.启动一个新的应用程序。这些能够触发内存回收的事件最终调用的函数接口就是 activityIdleInternal()。

Android内存检测方法:

DDMS工具:

前提:安装debug包

内存监测工具 DDMS --> Heap

1. 手机连接电脑,打开“USB调试”模式 。
2. 链接成功后,在DDMS的Devices视图中将会显示手机设备的序列号,以及设备中正在运行的部分进程信息; 
3. 点击选中想要监测的进程,比如com.taobao.taobao进程; 
4. 点击选中Devices视图界面中最上方一排图标中的“Update Heap”图标; 
5. 点击Heap视图中的“Cause GC”按钮; 
6. 此时在Heap视图中就会看到当前选中的进程的内存使用量的详细情况。


说明: 
a) 点击“Cause GC”按钮相当于向虚拟机请求了一次gc操作; 
b) 当内存使用信息第一次显示以后,无须再不断的点击“Cause GC”,Heap视图界面会定时刷新,在对应用的不断的操作过程中就可以看到内存使用的变化;  
如何才能知道我们的程序是否有内存泄漏的可能性呢。这里需要注意一个值:Heap视图中部有一个Type叫做data object,即数据对象,也就是我们的程序中大量存在的类类型的对象。在data object一行中有一列是“Total Size”,其值就是当前进程中所有Java数据对象的内存总量,一般情况下,这个值的大小决定了是否会有内存泄漏。可以这样判断: 
a) 不断的操作当前应用,同时注意观察data object的Total Size值; 
b) 正常情况下Total Size值都会稳定在一个有限的范围内,也就是说由于程序中的的代码良好,没有造成对象不被垃圾回收的情况,所以说虽然我们不断的操作会不断的生成很多对 象,而在虚拟机不断的进行GC的过程中,这些对象都被回收了,内存占用量会会落到一个稳定的水平; 
c) 反之如果代码中存在没有释放对象引用的情况,则data object的Total Size值在每次GC后不会有明显的回落,随着操作次数的增多Total Size的值会越来越大, 
直到到达一个上限后导致进程被kill掉。  
总之,使用DDMS的Heap视图工具可以很方便的确认我们的程序是否存在内存泄漏的可能性。

使用的步骤:

1.程序出现内存泄露,进入终端导出hprof数据,输入:adb pull /sdcard/MemoryMonitor/com.taobao.taobao/leak_activity/2013-12-30-09-49-32/com.taobao.taobao.hprof。在当前路径下保存com.taobao.taobao.hprof

2.使用MAT分析hprof文件,这里需要安装eclipse插件MAT。

3.原始生成的hprof,需要转换格式,才能被MAT解析,使用adt的sdk下tools里的hprof-conv命令转换:

hprof-conv 保存hprof的原始路径 转换后的hprof的存放路径和存放名

如:
hprof-conv /Users/com.taobao.taobao.hprof      /Users/orderlist.hprof

android 内存泄露测试的更多相关文章

  1. Android 内存泄露测试数据处理--procrank,setprop,getprop(转)

    1.Android内存测试常用的几个概念. VSS--virtual set size 虚拟耗用内存(包含共享库占用的内存)RSS--Resident set size实际使用的物理内存(包含共享库占 ...

  2. Android内存泄露测试

    Android性能测试过程中的一些常用命令: CPU: adb shell top -n | grep "+PackageName 内存: adb shell dumpsys meminfo ...

  3. 移动端测试===Android内存泄露和GC机制(转)

    本文转自:https://www.testwo.com/article/1153 1.前言 Hello,小伙伴们,相信大家在项目测试中都遇到过内存泄露问题,小编也着实爬过很多坑.比如小编所测项目,更换 ...

  4. (转)专项:Android 内存泄露实践分析

    今天看到一篇关于Android 内存泄露实践分析的文章,感觉不错,讲的还算详细,mark到这里. 原文发表于:Testerhome: 作者:ycwdaaaa ;  原文链接:https://teste ...

  5. android内存泄露调试,Heap,MAT

    三.内存监测工具 DDMS --> Heap 无论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方.Android tools中 ...

  6. android 内存泄露之jni local reference table overflow (max=512)

    在android项目中要实现一个需求 为了性能的要求只能用c代码来实现功能. 这样就牺牲了java跨平台性. 通过加载.so的方式,把用c实现的模块集成到app中. android提供jni层,作为一 ...

  7. 【android内存泄露】 WebView篇

    在咱的博客园app里,新闻的内容使用WebView展示的.在测试中,咱重复进入.退出某个新闻10多次,观察到 Objects一直在不断增长,反复触发GC,但是一直回收不了,占用的内存越来越高,于是警觉 ...

  8. Android内存泄露自动检测神器LeakCanary

    经典的面试题: a.怎样在coding过程中避免内存泄露? b.怎样检测内存泄露? 这两个问题我想大部分Android 职位面试时都会被问到吧. 怎样避免就不赘述了,网上很多答案. 工具呢,当然也有很 ...

  9. Android内存泄露调试

    Android 内存泄漏调试 一.概述 如果我们编写的代码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机.为了能够使得 Android 应用程序安全且快速的运行, Andr ...

随机推荐

  1. js中关于事件捕获与事件冒泡的小实验

    1.事件冒泡:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div - ...

  2. php中替换中文引号不成功的原因

    中文引号替换成英文引号,突然发现总是不成功. 后来查找资料得知,需要写成这种风格的. 正确代码如下:   中文单引号: str_replace('‘',''',$str);str_replace('’ ...

  3. servlet的九大内置对象和四大域对象

    隐式对象 说明 request 转译后对应HttpServletRequest/ServletRequest对象 response 转译后对应HttpServletRespons/ServletRes ...

  4. PCANet: A Simple Deep Learning Baseline for Image Classification?----中文翻译

    一 摘要 在本文中,我们提出了一个非常简单的图像分类深度学习框架,它主要依赖几个基本的数据处理方法:1)级联主成分分析(PCA);2)二值化哈希编码;3)分块直方图.在所提出的框架中,首先通过PCA方 ...

  5. ue4 tags 与 cast

    父类设置tags,子类默认自动添加这个tags 子类可以强行删除父类的tags,这时如果把子类cast为父类,一样找不到这个tags 综上,要找到一个actor的tags,那么这个actor上就一定要 ...

  6. opengl学习资料

    opengl新手指引 https://www.codeproject.com/articles/771225/learning-modern-opengl Learning Modern 3D Gra ...

  7. CF961G Partitions(第二类斯特林数)

    传送门 对于每一个元素,我们只要能求出它的出现次数\(sum\),那么每个元素的贡献都是一样的,最终的答案为\(sum\times \sum_{i=1}^n w_i\) 那么分别讨论 如果这个元素自己 ...

  8. 剑指Offer的学习笔记(C#篇)-- 对称的二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 一 . 题目分析 递归法. 一.空树判断,单独搞出来. 二.非空树. 递归:一 ...

  9. VMWare虚拟机Windows下的下载与安装

    原文链接:http://www.studyshare.cn/blog-front//software/details/1161/0一.下载此处收集各种开发工具软件,供下载官网下载:https://ww ...

  10. JS高级学习历程-10

    [面向对象] 面向对象的三大特性:封装.继承.多态 封装:在“类”里边有关键字public.protected.private 对成员进行声明,这样每个成员的访问都会受到不同关键字的限制. 继承:在p ...