應用內存測試分析
測試環境:
版本信息:
安裝包大小:
系統環境: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
應用內存測試分析