作Android QQ性能测试时,内存测试中遇到很多困惑,”各类”内存术语,到底什么意思,怎么获取,这里总结一下。 进行的内存测试主要有两个方面,一,OOM的发现和定位,二,同历史版本或竞品的对比测试。关于oom能够用MAT进行分析,具体分析方法参见susanwu在km上的文章《如何使用Memory_Analyzer分析内存泄漏》。下面主要总结一下Android性能测试中经常使用的方法及解释java
从Android 2.0开始,在Settings中加入了一个新的activity("Running Services" activity),它用于显示当前运行的每一个Services进程的内存使用状况及整个手机的内存大体使用状况。能够经过Setting->Applications->Running services进入该activity。 使用该方法须要注意,一些应用程序可能有几个进程,可是在这里只显示了其中的某个进程。好比微信,在Running services activity只能看到子进程com.tencent.mm:push的内存信息,因此,这个统计有时候是不可靠的。android
###1. Procrank命令,Procrank能够同时得到如下几种内存的信息: VSS:Virtual Set Size虚拟耗用内存(包含共享库占用的内存)。This size also includes memory that may not be resident in RAM like mallocs that have been allocated but not written to,因此用VSS来衡量一个进程实际使用的内存意义不大。shell
RSS : Resident Set Size实际使用物理内存(包含共享库占用的内存)。 RSS can be misleading, because it reports the total all of the shared libraries that the process uses, even though a shared library is only loaded into memory once regardless of how many processes use,因此用RSS来衡量进程占用的内存信息不是特别准确。微信
PSS - Proportional Set Size实际使用的物理内存(比例分配共享库占用的内存)。 PSS is a very useful number because when the PSS for all processes in the system are summed together, that is a good representation for the total memory usage in the system,因此用pss衡量程序占用的内存偏差比较小。app
USS - Unique Set Size进程独自占用的物理内存(不包含共享库占用的内存). USS is an extremely useful number because it indicates the true incremental cost of running a particular process,因此用USS描述进程占用内存的波动和峰值比较有意义。less
通常存在如下关系VSS>=RSS>=PSS>=USS。ide
若是要得到某个进程的内存信息,用procrank是个不错的选择,可是目前不少android系统都不支持这个命令,HTC手机部分原生系统支持,好比g3的2.2.1rom。性能
输入命令行adb shell top
,输出以下图所示:列出top*进程的cpu和内存占用状况,默认按照cpu占用降序排列。top能够得到进程的VSS和RSS信息,命令持续的监视,因此我的以为这是一个快速查看进程内存和cpu的好方法。测试
PS命令能够得到应用程序的VSIZE(VSS)和RSS,PS是一个得到的是应用的瞬间状态,不须要退出确认,所以在自动化脚本上比较好用。ps | grep appName
直接输出appName进程对应的内存信息。命令行
dumpsys 用来给出手机中全部应用程序的信息,而且也会给出手机的状态。用如下命令能够查看程序的内存使用状况:adb shell dumpsys meminfo $package_name or $pid //使用程序的包名或者进程id
android程序内存被分为2部分:native和dalvik,dalvik就是咱们日常说的java堆,咱们建立的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是native+dalvik不能超过最大限制。android程序内存通常限制在16M和24M
size:总内存大小(kb)。 Allocated:表示的是已使用了的内存大小(kb), Free:表示的是剩余的内存大小(kb) PrivateDirty:非共享的,又不能换页出去(can not be paged to disk )的内存的大小。和USS类似,可是实际实践中,发现他们仍是有细微的差异,如今尚未搞明白。 SharedDirty:参照PrivateDirty我认为它应该是指共享的,又不能换页出去(can not be paged to disk )的内存的大小。好比Linux为了提升分配内存速度而缓冲的小对象,即便全部共享它的进程结束,该内存也不会释放掉,它只是又从新回到缓冲中而已。
###5. adb shell cat /proc/meminfo
该方式只能得出系统整个内存的大概使用状况。
MemTotal :可供系统和用户使用的总内存大小 (它比实际的物理内存要小,由于还有些内存要用于radio, DMA buffers,等). MemFree:剩余的可用内存大小。这里该值比较大,实际上通常Android system的该值一般都很小,由于咱们尽可能让进程都保持运行,这样会耗掉大量内存。
Cached: 系统用于文件缓冲等的内存.一般systems须要20MB以免bad paging states。 ###6. cat /proc/$pid/status