应用内存测试分析

测试环境:

版本信息:

安装包大小:

系统环境:OPPO R7s

操作系统版本:4.4.4

该文章目的:

抛砖引玉,旨在描述和指导如何在android上测试与分析app的内存情况

术语释义

  • 空负荷:app已经在后台运行,但是用户没有使用;
  • 中负荷:app在前台运行,用户进行了少量操作;
  • 满负荷:用户持续频繁大量操作,app接近饱和状态运行。

一些经验:

除了第一种情况,其它两种的主观性很强,不是很容易区分。正常产品测试的时候,只要验证后台运行(5~10分钟为宜)和用户持续频繁大量操作(10~15分钟为宜)这两种情况下就足够了;且可以借助安卓monkey脚本辅助。

第一步:用dumpsys meminfo 或 DDMS进行检测

通过adb shell获取应用运行时内存

adb shell dumpsys meminfo [$pid] or [$pkgName]

图解:

VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)

PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)

USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

根据测试需要,一般会参考RSS和PSS,作为测试指标

通过DDMS Dump Heap进行检测/测试

图解:

Heap Size:系统分配给当前应用程序的总内存。对应读内存的代码: Runtime.getRuntime().totalMemory()

Allocated:应用程序当前占用的实际内存;

Free:分配的内存中的空闲内存。对应读内存的代码:Runtime.getRuntime().freeMemory()

三者之间的关系: Heap Size = Allocated + Free

第二步:反复执行具体场景,观察Heap Size和Allocated

  • 如何判断有leak

    Heap视图中有一行数据是叫data object,即数据对象。它是我们app中大量存在的类类型的对象。 在data object中有一列 Total Size ,它的值就是当前进程中所有java对象的内存总量。 一般情况下,这个值决定是否内存泄漏。

    所以,不断的操作某个场景(比如反复提交数据,反复加载数据),Total Size的值一般会稳定在一个正常范围内。内存会有一个先增加(不断的生成对象),后下降(对象被回收)。如果程序的代码处理良好,那么内存占用量会有一个明显的回落,并且稳定在一个正常水平。内存占用量就没有一个明显的回落,并且会越来越高,那么就意味着有leak,最终出现OOM,被虚拟机kill掉程序

第三步:利用MAT或YourKit进行分析

此处不描述,若感兴趣自行找些资料,比如http://blog.csdn.net/feng88724/article/details/6460918

补充--android检测内存泄漏的工具:

LeakCanary

参考资料

http://blog.csdn.net/yehui928186846/article/details/51387079

http://blog.csdn.net/feng88724/article/details/6460918

https://my.oschina.net/yyn2010/blog/112363

http://blog.csdn.net/duantihi/article/details/50791494

http://gdgzzch.blog.163.com/blog/static/37640452201371483147573/

http://hubingforever.blog.163.com/blog/static/17104057920114411313717/

https://developer.android.com/studio/profile/heap-viewer-walkthru.html

原文地址:https://www.cnblogs.com/hailongchen/p/8605696.html

时间: 2024-08-29 05:00:57

应用内存测试分析的相关文章

View的post方法导致的内存泄漏分析

简述: 写这篇文章的缘由是最近项目中查内存泄漏时,发现最终原因是由于异步线程调用View的的post方法导致的. 为何我会使用异步线程调用View的post方法,是因为项目中需要用到很多复杂的自定义布局,需要提前解析进入内存,防止在主线程解析导致卡顿,具体的实现方法是在Application启动的时候,使用异步线程解析这些布局,等需要使用的时候直接从内存中拿来用. 造成内存泄漏的原因,需要先分析View的post方法执行流程,也就是文章前半部分的内容 文章内容: View#post方法作用以及实

内存泄露分析之MAT工具简单使用

使用了Heap视图的方式来分析内存泄露之后,我们尝试用MAT插件来分析下. MAT,提供了太强大的功能,以至于在测试的过程中也是懵懂的,没有彻底的研究. 1. 安装Android Sdk,Java SDK,Eclipse之类的软件之后, 2. 安装Eclipse MAT插件 3. 调出DDMS的Heap视图 4. 手机连接电脑之后,选择要测试的进程,并点击Heap 5. 在手机上操作需要测试的功能 6. 选择Dump HPROF file功能. 7. 如果Eclipse中直接安装了MAT插件之后

javascript内存模型分析猜想

/* * 这里我是利用分析java内存模型的方法来猜想javascript的内存模型, * 由于没有看到国内有关于分析javascript的书籍,但是可以借鉴java的 * 内存模型结构来帮助理解javascript的内存模型中的原型机制,下面先 * 给出一个简单的原型例子 * */ "use strict"; function PrototypeModel(name,author,time){ } PrototypeModel.prototype.name = "Proto

Java内存泄漏分析与解决方案

Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历与各位网友分享解决这些问题的办法. 作为Internet最流行的编程语言之一,Java现正非常流行.我们的网络应用程序就主要采用Java语言开发,大体上分为客户端.服务器和数据库三个层次.在进入测试过程中,我们发现有一个程序模块系统内存和CPU资源消耗急剧增加,持续增长到出现java.lang.Ou

内存测试分享文档

回页首 Valgrind 概述 体系结构 Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具:而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务.Valgrind的体系结构如下图所示: 图 1 Valgrind 体系结构 Valgrind包括如下一些工具: Memcheck.

安卓开发中内存问题分析(一)工具篇

内存泄漏和内存溢出是安卓开发中经常碰到的问题,如何能够快速有效的发现并追踪内存泄漏或者内存溢出的源头,是每个开发者都需要掌握的技巧,今天我给大家带来常见的内存分析工具使用方法,希望对大家今后的开发带来帮助. 使用Eclipse分析应用内存使用情况 具体步骤如下: 1.启动eclipse后,切换到DDMS透视图,并通过Window-ShowView打开Devices视图.Heap视图 2.连接手机或者模拟器后,在DDMS的Devices视图中将会显示手机设备或模拟器的序列号,以及设备中正在运行的部

MiS603开发板 第十五章 MCB DDR3内存测试

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第十五章 MCB DDR3内存测试 15.1 DDR3存储器模块及其测试 图像算法硬件最关键的一部分就是内存,内存保

cocos2d-x与ios内存管理分析(在游戏中减少内存压力)

Cocos2d-x与ios内存管理分析(在游戏中减少内存压力) 猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网--Cocos2Dev.com,谢谢! 年 原文地址: http://www.cocos2dev.com/?p=281 注:自己以前也写过Cocos2d-x如何优化内存的使用,以及内存不足的情况下怎么处理游戏.今天在微博中看到有朋友介绍了下内存,挺详细的.不知道是谁写的,我记录下. 一,iOS与图片内存 在iOS上,图片会被自动缩放到2的N次方大小.比如一张1024*102

Android内存泄漏分析及调试

尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析 首先了解一下dalvik的Garbage Collection: 如上图所示,GC会选择一些它了解还存活的对象作为内存遍历的根节点(GC Roots),比方说thread stack中的变量,JNI中的全局变量,zygote中的对象(class loader加载)等,然后开始对heap进行遍历.到最后,