內存分析是Profiler中的一個組件旦装,可以幫助我們識別可能會導致應用卡頓、凍結甚至崩潰的內存泄露和內存抖動区转。可以顯示應用內存使用情況實時圖表版扩,幫助我們捕獲堆轉儲废离、強制執(zhí)行垃圾回收以及跟蹤內存的分配情況。
打開內存分析步驟:
1礁芦、依次點擊View→Tool Window→Profiler
2蜻韭、從Profiler工具欄中選擇要分析的設備以及應用進程。(需要優(yōu)先確保設備通過USB正常連接IDE)
3、點擊MEMORY時間軸上的任意位置可以打開內存分析湘捎。
一诀豁、分析應用內存的目的
當應用存在不再使用的某些對象時窄刘,垃圾回收器會將未使用的內存釋放窥妇。如果應用分配內存的速度比系統(tǒng)回收的速度快時,回收器要釋放足夠的內存來滿足應用的分配需要時娩践,應用可能會產生延遲活翩,從而可能導致應用跳幀,使應用明顯變慢翻伺。
即使應用使用過程中未表現(xiàn)出變慢材泄,但如果存在內存泄漏,應用掛在后臺運行時吨岭,依然會保留相應的內存拉宗。從而導致系統(tǒng)強制執(zhí)行不必要的垃圾回收時間,從而拖慢系統(tǒng)其余部分的內存性能辣辫,最終使系統(tǒng)被迫終止應用進程以回收內存旦事。致使用戶返回應用時,必須重啟急灭。影響到用戶體驗姐浮。
因此可以通過以下幾種操作從而防止這些問題:
1、在時間軸上查找可能會導致性能問題的不理想內存分配進行查看葬馋;
2卖鲤、轉儲java堆以便查看在任何給定時間內有哪些對象在占用內存。在一個較長的時間段內進行多次堆轉儲有助于分析內存泄漏點畴嘶,常用該種方式檢測蛋逾;
3、記錄正常與極端情況下用戶交互期間的內存分配情況窗悯。從而準確識別代碼中可能存在的短時間內分配過多對象而出現(xiàn)泄漏的情況区匣。
二、Profiler概覽
打開Profiler后蟀瞧,選擇設備以及應用沉颂,則可以看到時間軸界面,其中包含CPU悦污、MEMORY铸屉、ENERGY的情況。其中MEMORY為內存分析器切端、ENERGY為電池分析器彻坛;
其中我們主要是用內存分析器工具。
當中有三項選擇:Capture heap dump:獲取堆轉儲,該為目前主要檢測手段昌屉,稍后講解钙蒙;
Record native allocations:獲取設備上錄制原生分配情況;
Record Java/Kotlin allocations:獲取錄制Java和Kotlin分配情況间驮;
三躬厌、查看內存分配情況
1、內存分配情況表可以顯示內存中每個java對象和JNI引用的分配方式竞帽。因此扛施,內存分析器可以顯示有關對象分配情況信息如下:
--分配了哪些類型的對象以及他們使用了多少空間;
--每個分配堆棧的軌跡屹篓,包括在哪些線程中疙渣;
--對象何時被取消分配等;
如果需要中Android 10以及更高版本的設備上錄制原生分配情況堆巧,需要選擇Record native allocations妄荔,然后點擊Record,錄制會持續(xù)到點擊Stop為止谍肤,之后內存分析界面會轉換到顯示原生錄制的屏幕中啦租。
注意:低于android10,record native allocations選項不可使用谣沸。
如果需要錄制java和kotlin分配情況刷钢,請選擇record java/kotlin allocations,然后選擇record乳附。如果設備搭載的是android8+内地,則內存分析將可以轉換顯示就行錄制的界面,可以按緊選中某一塊區(qū)域進行查看赋除。
四阱缓、捕獲堆轉儲
堆轉儲顯示捕獲堆轉儲時應用中對象正在使用的內存,尤其是在長時間的操作中举农,堆轉儲會顯示認為不應該再存在的內存對象荆针,從而幫助識別內存泄漏。
如果需要捕獲堆轉儲颁糟,需要選擇capture heap dump航背,然后選擇record。一段時間后棱貌,就會生成heap dump玖媚,可進行查看,也可以通過第三方工具Memory Analyzer進行查看婚脱。
由于新版IDE剔除了Memory Analyzer工具今魔,因此勺像,目前查看需要通過eclipse中的插件工具memory analyzer進行查看〈砩可通過工具下載進行試驗:http://www.eclipse.org/mat/downloads.php
通過工具打開phrof文件吟宦,進入主界面
點擊leak suspects可查看疑似內存泄漏的地方,點擊detail可以查看分析出ArryList存放對象Person出了問題涩维。
也可以在overview中點擊dominator_tree查看堆占比殃姓,可以看出一個線程占比過高,集合中對象的數(shù)量過多等激挪。