本文章轉(zhuǎn)載于搜狗測試
當(dāng)軟件實現(xiàn)了新功能后,準(zhǔn)備發(fā)布版本前,必須進行性能測試以確定沒有性能問題,內(nèi)存使用情況便是其中必須要測試的性能之一。由于內(nèi)存組成的復(fù)雜性,并沒有簡單通用的方法能夠發(fā)現(xiàn)所有的內(nèi)存問題。有時候因為問題比較明顯,就真的發(fā)現(xiàn)了問題,但是對于較為成熟的軟件,并不是那么容易發(fā)現(xiàn)內(nèi)存問題?,F(xiàn)在從內(nèi)存測試流程、內(nèi)存測試方法、內(nèi)存占用的評判建議三個方面總結(jié)如下,希望能提升內(nèi)存測試的有效性。
內(nèi)存測試流程
以V8.8泛靈犀功能為例,介紹下這個流程中的要點:
1)代碼:保證進行泛靈犀內(nèi)存測試的版本是純凈版,沒有附加多余的Log和調(diào)試用組件
2)測試場景:V8.8泛靈犀功能是當(dāng)前新開發(fā)的功能,只需要對該功能進行性能測試,因此測試場景主要針對V8.8泛靈犀功能組織,包括該功能的開啟前、運行、結(jié)束后等測試點,即在輸入框中輸入要搜索的文字→點擊四葉草搜索→結(jié)果左右滑動→收起搜索結(jié)果;另一類是整體性能,考察應(yīng)用的常見場景,在綜合使用情況下的性能指標(biāo),測試場景應(yīng)當(dāng)包括啟動后待機、切換到后臺、執(zhí)行主要功能以及反復(fù)執(zhí)行各功能。在兩類場景中,重點關(guān)注:
①包含了圖片顯示的界面;
②網(wǎng)絡(luò)傳輸大量數(shù)據(jù);
③需要緩存數(shù)據(jù)的場景
3)場景轉(zhuǎn)換成用例:選取了測試場景之后,針對內(nèi)存測試的特點設(shè)計用例,通過①與V8.7版本泛靈犀功能的內(nèi)存變化作對比;②利用UIAutomator將測試場景轉(zhuǎn)化為腳本,長時間運行泛靈犀功能,比較操作前后內(nèi)存的變化來評估V8.8泛靈犀的內(nèi)存
4)執(zhí)行:將采集到的數(shù)據(jù)以圖形的形式展現(xiàn),觀察內(nèi)存的波動
5)分析:分析內(nèi)存時重點關(guān)注如下幾個字段:
①Native/Dalvik 的 Heap ,分別給出的是JNI層和Java層的內(nèi)存分配情況,如果發(fā)現(xiàn)這個值一直增長,
則代表程序可能出現(xiàn)了內(nèi)存泄漏;
②Total 的 PSS 信息,代表應(yīng)用真正占據(jù)的內(nèi)存大小,通過它可以判別手機中哪些程序占內(nèi)存比較大了。
其他評判方法可參考第三小節(jié):內(nèi)存占用評判建議
內(nèi)存測試方法
1)Android Studio自帶內(nèi)存檢測功能
可以方便地看出GC(垃圾回收)情況和明顯的內(nèi)存趨勢。如果存在明顯的內(nèi)存泄漏,就會表現(xiàn)為隨著功能的反復(fù)使用,內(nèi)存值不斷升高,即使出現(xiàn)GC也沒法降下來。測試時,重點關(guān)注兩點:①退出某個頁面后,內(nèi)存是否回落;②進行某個操作后,內(nèi)存增長的過快,需要反復(fù)操作進行確認(rèn)。
2)dumpsys meminfo
參數(shù)含義:
Naitve Heap Size:從mallinfo usmblks獲得,代表最大總共分配空間
Native Heap Alloc:從mallinfo uorblks獲得,總共分配空間
Native Heap Free:從mallinfo fordblks獲得,代表總共剩余空間
Native Heap Size約等于Native Heap Alloc + Native HeapFree
Dalvik Heap Size:從Runtime totalMemory()獲得,Dalvik Heap總共的內(nèi)存大小。
Dalvik Heap Alloc: Runtime totalMemory()-freeMemory(),Dalvik Heap分配的內(nèi)存大小。
Dalvik Heap Free:從Runtime freeMemory()獲得,Dalvik Heap剩余的內(nèi)存大小。
Dalvik Heap Size約等于Dalvik? HeapAlloc +Dalvik? Heap Free
3)使用ActivityManager.getMemoryInfo()方法獲得內(nèi)存信息
搜狗哆啦A夢中的性能監(jiān)控工具就是通過該方法獲取應(yīng)用的內(nèi)存和cpu,相關(guān)代碼如下:
性能監(jiān)控工具使用步驟:
①下載哆啦A夢工具并安裝http://duola.sogou.com/;
②切換到設(shè)置頁面,點擊“被測應(yīng)用設(shè)置”,在應(yīng)用列表中選擇要監(jiān)控的應(yīng)用程序,設(shè)為被測應(yīng)用;
③切換到工具頁面,點擊+按鈕;
④在通用工具里找到性能監(jiān)控工具,點擊“添加”;
⑤點擊性能監(jiān)控,在如下頁面中可以設(shè)置數(shù)據(jù)采樣頻率,還可以查看內(nèi)存變化趨勢/查看CPU占用變化趨勢/查看流量耗用情況;
⑥開啟懸浮窗,可以實時看到內(nèi)存的變化/CPU的變化/應(yīng)用流量;
⑦測試完成后,點擊“停止測試”,性能測試數(shù)據(jù)保存在sdcard/DoraemonBox/PerformanceTest下,可以從里面獲取內(nèi)存信息。
內(nèi)存占用評判建議
最初通過哆啦A夢的性能監(jiān)控工具進行性能評測時,得出的結(jié)果不知道內(nèi)存cpu波動是否在預(yù)期之內(nèi),不懂得如何評估。經(jīng)過了解,可以從以下幾個方面考慮:
1)首先與有該功能的以往版本和競品做對比,得出內(nèi)存的差值
比如搜狗輸入法每個版本都會做內(nèi)存占用評測,對比搜狗輸入法與以往版本
及競爭對手在內(nèi)存上的消耗量,通過內(nèi)存的差值可以較為直觀地判斷出該版本的內(nèi)存占用情況。下圖是搜狗輸入法8.5版本與之前8.4版本和競品的內(nèi)存消耗對比
2)若之前版本和競品都無該功能,可將應(yīng)用的基本功能消耗的內(nèi)存作為參考
比如8.5泛靈犀,這是一個全新的功能,且競品也沒有該功能,將隨機打字消耗的內(nèi)存作為參考,比較泛靈犀的內(nèi)存相對于正常的打字是否有較大的增長。下圖是搜狗輸入法8.5泛靈犀主動情況下與隨機打字的內(nèi)存消耗對比
3)內(nèi)存有無泄漏
判斷內(nèi)存是否泄漏的方法是:①在測試過程中是否存在因為內(nèi)存不足導(dǎo)致的應(yīng)用crash;②內(nèi)存是否存在持續(xù)上漲的情況。針對上圖泛靈犀主動情況下的內(nèi)存占用,可從內(nèi)存有無泄漏角度分析:泛靈犀主動情況下對圖片和動圖進行操作時,內(nèi)存增長30%-40%,但退出圖片和動圖后內(nèi)存回降,并且在測試過程中不存在因為內(nèi)存不足導(dǎo)致的應(yīng)用崩潰,測試過程中沒有內(nèi)存泄漏,經(jīng)溝通符合預(yù)期。
4)內(nèi)存峰值是否在單個應(yīng)用所允許的最大值之內(nèi)
最大值可參考:①手機硬件配置;②系統(tǒng)所允許的最大值;③相比類似應(yīng)用的峰值。在手機的設(shè)置→用用程序管理器→應(yīng)用程序信息中可以看到應(yīng)用所占用的手機內(nèi)存大小。若某個功能的內(nèi)存峰值小于該應(yīng)用所占內(nèi)存,基本是符合預(yù)期的。