Android Studio中內(nèi)存分析工具M(jìn)emory profiler的使用
參考文章
1. 打開Memory Profiler
有兩種方式打開,第一種通過標(biāo)題欄打開:
第二種通過下方菜單欄打開
2. 工具使用
打開后是這樣的:
打開后,點(diǎn)擊 + 號,選擇自己包名
選擇完成后,就會創(chuàng)建你項(xiàng)目的SESSIONS界面:
如果想刪除這個(gè)SESSIONS,右鍵刪除:
點(diǎn)擊memory這一列
點(diǎn)擊后到內(nèi)存捕獲類型頁面
3. 內(nèi)存選項(xiàng)說明
- 捕獲堆轉(zhuǎn)儲(Capture heap dump):查看應(yīng)用程序中在特定時(shí)間點(diǎn)使用內(nèi)存的對象
- 記錄Native分配(Record native allocations):查看每個(gè)C/C++對象在一段時(shí)間內(nèi)是如何分配的
- 記錄java/kotlin分配(Record java/kotlin allocations):查看在一段時(shí)間內(nèi)如何分配每個(gè)java/kotlin對象
然后是這個(gè)頁面
然后看到這個(gè)頁面
4. 內(nèi)存性能分析器概覽
原文鏈接
內(nèi)存性能分析圖
當(dāng)您首次打開內(nèi)存性能分析器時(shí),您將看到一條表示應(yīng)用內(nèi)存使用量的詳細(xì)時(shí)間軸,并可使用各種工具強(qiáng)制執(zhí)行垃圾回收、捕獲堆轉(zhuǎn)儲以及記錄內(nèi)存分配
- 用于強(qiáng)制執(zhí)行垃圾回收事件的按鈕
- 用于捕獲堆轉(zhuǎn)儲的按鈕
- 用于指定性能分析器多久捕獲一次內(nèi)存分配的下拉菜單
- 用于縮放時(shí)間軸的按鈕
- 用于跳轉(zhuǎn)到實(shí)時(shí)內(nèi)存數(shù)據(jù)的按鈕
- 事件時(shí)間軸,顯示活動狀態(tài)、用戶輸入事件和屏幕旋轉(zhuǎn)事件
- 內(nèi)存使用量時(shí)間軸,它會顯示以下內(nèi)容
- 一個(gè)堆疊圖表,顯示每個(gè)內(nèi)存類別當(dāng)前使用多少內(nèi)存,如左側(cè)的 y 軸以及頂部的彩色鍵所示
- 一條虛線,表示分配的對象數(shù),如右側(cè)的 y 軸所示
- 每個(gè)垃圾回收事件的圖標(biāo)
5. 內(nèi)存計(jì)算方式
內(nèi)存性能分析器頂部看到的數(shù)字
內(nèi)存計(jì)數(shù)中的類別如下
- Java:從 Java 或 Kotlin 代碼分配的對象的內(nèi)存
- Native:從 C 或 C++ 代碼分配的對象的內(nèi)存
- Graphics:圖形緩沖區(qū)隊(duì)列為向屏幕顯示像素(包括 GL 表面、GL 紋理等等)所使用的內(nèi)存
- Stack:您的應(yīng)用中的原生堆棧和 Java 堆棧使用的內(nèi)存。這通常與您的應(yīng)用運(yùn)行多少線程有關(guān)
- Code:您的應(yīng)用用于處理代碼和資源(如 dex 字節(jié)碼、經(jīng)過優(yōu)化或編譯的 dex 代碼、.so 庫和字體)的內(nèi)存
- Others:您的應(yīng)用使用的系統(tǒng)不確定如何分類的內(nèi)存
- Allocated:您的應(yīng)用分配的 Java/Kotlin 對象數(shù)。此數(shù)字沒有計(jì)入 C 或 C++ 中分配的對象
6. 查看內(nèi)存分配
選擇Capture heap dump,并點(diǎn)擊Record按鈕,開始捕獲,捕獲完成后,點(diǎn)擊Stop,進(jìn)行分析
查看捕獲結(jié)果
檢查分配記錄步驟:
- 點(diǎn)擊 Class Name 列標(biāo)題以按字母順序排序。然后,點(diǎn)擊一個(gè)類名稱。此時(shí)下側(cè)將出現(xiàn)
- Instance View 窗格,顯示該類的每個(gè)實(shí)例
- 在 Instance View 窗格中,點(diǎn)擊一個(gè)實(shí)例。此時(shí)下方將出現(xiàn) References 標(biāo)簽頁,顯示該實(shí)例被4. 分配到何處以及在哪個(gè)線程中。
- 在 References 標(biāo)簽頁中,右鍵點(diǎn)擊任意行并選擇 Jump to Source,以在編輯器中打開該代碼
菜單查看說明
菜單-檢查的堆:
- default heap:當(dāng)系統(tǒng)未指定堆時(shí)
- image heap:系統(tǒng)啟動映像,包含啟動期間預(yù)加載的類。此處的分配確保絕不會移動或消失
- zygote heap:寫時(shí)復(fù)制堆,其中的應(yīng)用進(jìn)程是從 Android 系統(tǒng)中派生的
- app heap:您的應(yīng)用在其中分配內(nèi)存的主堆
- JNI heap:顯示 Java 原生接口 (JNI) 引用被分配和釋放到什么位置的堆
菜單-分配:
-
Arrange by class:根據(jù)類名稱對所有分配進(jìn)行分組。這是默認(rèn)值
-
Arrange by package:根據(jù)軟件包名稱對所有分配進(jìn)行分組
-
Arrange by callstack:將所有分配分組到其對應(yīng)的調(diào)用堆棧
-
捕獲Native方式查看內(nèi)存分配
捕獲Native
native結(jié)果數(shù)據(jù)
結(jié)果信息說明: -
Allocations:在選定時(shí)間段內(nèi)通過 malloc() 或 new 運(yùn)算符分配的對象數(shù)
-
Deallocations:在選定時(shí)間段內(nèi)通過 free() 或 delete 運(yùn)算符解除分配的對象數(shù)
-
Allocations Size:在選定時(shí)間段內(nèi)所有分配的總大?。ㄒ宰止?jié)為單位)
-
Deallocations Size:在選定時(shí)間段內(nèi)所有已釋放內(nèi)存的總大小(以字節(jié)為單位)
-
Total Count:Allocations 列中的值減去 Deallocations 列中的值所得的結(jié)果
-
Remaining Size:Allocations Size 列中的值減去 Deallocations Size 列中的值所得的結(jié)果
7. 捕獲java/kotlin方式查看內(nèi)存分配
Allocation Tracking下拉菜單說明
- Full:捕獲內(nèi)存中的所有對象分配。這是 Android Studio 3.2 及更低版本中的默認(rèn)行為
- Sampled:定期對內(nèi)存中的對象分配情況進(jìn)行采樣。
- Off:停止跟蹤應(yīng)用的內(nèi)存分配
8. 堆轉(zhuǎn)儲文件導(dǎo)入和導(dǎo)出
- 堆轉(zhuǎn)儲文件導(dǎo)出
在Sessions列表中,點(diǎn)擊會話條目右側(cè)的 Export method trace 或 Export system trace 按鈕 - 堆轉(zhuǎn)儲文件導(dǎo)入
Sessions 窗格中點(diǎn)擊 Start new profiler session 圖標(biāo)"+",然后選擇 Load from file
內(nèi)存性能分析器中的泄漏檢測
-
檢查內(nèi)存泄漏
捕獲堆轉(zhuǎn)儲(Capture heap dump)檢測期間操作設(shè)備,完成后點(diǎn)擊Stop按鈕,檢測結(jié)束后,顯示有內(nèi)存泄漏及內(nèi)存泄漏的數(shù)目 -
如何查看內(nèi)存泄漏的位置
雙擊內(nèi)存泄漏的位置,顯示內(nèi)存泄漏的列表 -
點(diǎn)擊列表中其中一個(gè),顯示實(shí)例對象
-
點(diǎn)擊實(shí)例對象,顯示詳細(xì)信息
-
切換到References選項(xiàng)卡,并點(diǎn)擊show nearest GC root only
-
右鍵選擇jump to source
文章來源:http://www.zghlxwxcb.cn/news/detail-743577.html
-
跳轉(zhuǎn)到源碼,可以看到是thread引起的內(nèi)存泄漏
文章來源地址http://www.zghlxwxcb.cn/news/detail-743577.html
到了這里,關(guān)于android studio內(nèi)存分析之Memory profiler的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!