Android 終端性能測試——內存篇

前言

作Android QQ性能測試時,內存測試中遇到很多困惑,」各類」內存術語,到底什麼意思,怎麼獲取,這裏總結一下。 進行的內存測試主要有兩個方面,一,OOM的發現和定位,二,同歷史版本或競品的對比測試。關於oom能夠用MAT進行分析,具體分析方法參見susanwu在km上的文章《如何使用Memory_Analyzer分析內存泄漏》。下面主要總結一下Android性能測試中經常使用的方法及解釋java

一:running services"查看service進程內存

從Android 2.0開始,在Settings中加入了一個新的activity("Running Services" activity),它用於顯示當前運行的每一個Services進程的內存使用狀況及整個手機的內存大體使用狀況。能夠經過Setting->Applications->Running services進入該activity。 使用該方法須要注意,一些應用程序可能有幾個進程,可是在這裏只顯示了其中的某個進程。好比微信,在Running services activity只能看到子進程com.tencent.mm:push的內存信息,因此,這個統計有時候是不可靠的。android

二:經常使用的shell命令獲取:

###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。性能

2. Top命令

輸入命令行adb shell top,輸出以下圖所示:列出top*進程的cpu和內存佔用狀況,默認按照cpu佔用降序排列。top能夠得到進程的VSS和RSS信息,命令持續的監視,因此我的以爲這是一個快速查看進程內存和cpu的好方法。測試

3. Ps命令

PS命令能夠得到應用程序的VSIZE(VSS)和RSS,PS是一個得到的是應用的瞬間狀態,不須要退出確認,所以在自動化腳本上比較好用。ps | grep appName直接輸出appName進程對應的內存信息。命令行

4. dumpsys meminfo

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

相關文章
相關標籤/搜索