Android内存检测工具
什么是內存泄漏?
在運行的程序中,如果一個無法訪問的對象仍然占用著內存空間,即為此對象造成了內存泄漏
垃圾回收(GC)機制:
當垃圾回收運行時,虛擬機首先會識別GC Root。GC Root 是一個可以從堆外部訪問的對象,它可以是本地變量或運行中的線程等。虛擬機會識別所有可以從GC Root訪問的對象,它們將會被保留,而其他無法從GC Root訪問的對象,則會被認為垃圾并回收掉。
一、通過Memory Profiler檢測內存泄漏
打開 Memory Profiler,選中MEMORY ,進入MEMORY視圖,
點擊下圖所示按鈕,保存Heap Dump:
1.1、Activity 和 Fragment 內存泄漏檢測
Heap Dump 加載完成后,勾選 “Activity/Fragment Leaks” 選框:
此時如果有檢查到 Activity 或 Fragment 的泄漏,就會在界面中顯示出來:
需要注意的是:
針對 Fragment 有個特別的情況: 如果您載入的 Heap Dump 的時機,剛好介于 Fragment 被創建和被使用的時間之間,就會造成 Memory Profiler 誤報;相同情況也會發生在 Fragment 被緩存但是沒有被復用的時候
1.2、通過包名篩選來查看APP內其他內存泄漏的地方
選擇Arrange by package :選擇對應包名,查看可能存在內存泄漏的地方
① :選擇包名篩選
② :點擊LeakTestActivity$1 查看LeakedActivity內存泄漏的地方
③ :右鍵,跳轉到發生內存泄漏源碼的地方
1.3、通過觀察 MEMORY 內存圖標趨勢判斷是否發生內存泄漏
可以通過橫豎屏切換,或者多執行幾次可能發生內存泄漏的代碼,通過觀察MEMORY 軌跡趨勢,如果內存走向是增加的,則肯定發生了內存泄漏,如下圖:
查看堆和內存分配:
https://developer.android.com/studio/profile/memory-profiler?utm_source=android-studio#capture-heap-dump
二、HeapView 使用
啟動:Sdk/tools/monitor 啟動Monitor。端口沖突的話可以先關閉AS
A:打開DDMS視圖,
B:選擇Heap窗口
C:選擇對應包名,點擊Heap 按鈕
D:點擊Heap按鈕
E:Cause GC 更新數據
| Heap Size | 堆棧分配給App的內存大小 |
| Allocated | 已分配使用的內存大小 |
| Free | 空閑的內存大小 |
| %Used | Allocated/Heap Size,使用率 |
| Objects | 對象數量 |
內存詳情
| free | 空閑的對象 |
| data object | 數據對象,類類型對象,最主要的觀察對象 |
| class object | 類類型的引用對象 |
| 1-byte array(byte[],boolean[]) | 一個字節的數組對象 |
| non-Java object | 非Java對象 |
每一列含義:
| Count | 數量 |
| Total Size | 總共占用的內存大小 |
| Smallest | 將對象占用內存的大小從小往大排,排在第一個的對象占用內存大小 |
| Largest | 將對象占用內存的大小從小往大排,排在最后一個的對象占用的內存大小 |
| Median | 將對象占用內存的大小從小往大排,拍在中間的對象占用的內存大小 |
| Average | 平均值 |
點擊data object行時,可以看到如下的柱狀圖
橫坐標是對象的內存大小,這些值隨著不同對象是不同的,縱坐標是在某個內存大小上的對象的數量
2.1 HeapView使用場景:
Heap Viewer中的數值會自動在每次發生GC時會自動更新。
2.2 內存泄漏檢查
在需要檢測的用例執行后,手動點擊 按鈕,觸發GC,然后觀察 data object 一欄的 Total Size (也可以觀察Heap Size/Allocated內存的情況) ,看看內存會不會恢復到一個穩定的值,多次操作后,只要這個值穩定,說明沒有內存泄漏。
如果每次GC后值都在增長,則說明有內存泄漏的可能性
2.3 內存抖動檢查
內存抖動會伴隨著頻繁的GC。只需要開啟Heap View,觀察數據就行了。
如果發生內存抖動,會發現數據在短時間內頻繁更新
此部分參考:https://blog.csdn.net/zhangfei2018/article/details/49154479
三、LeakCanary檢查內存泄漏
添加依賴:
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4' releaseImplementation'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'Application中初始化:
這樣就能檢測Activity的內存泄漏了,當然Fragment或者其他的內存泄漏是檢測不到的。
如果需要檢查Fragment內存泄漏,需要使用RefWatcher來監控,修改如下:
在Application中提供一個全局的RefWatcher 對象,然后在Fragment調用如下:
更多內存分析方式:
dump文件分析、MAT分析
崩潰檢測
Monkey 檢測ANR和Crash
總結
以上是生活随笔為你收集整理的Android内存检测工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++内存检测工具valgrind
- 下一篇: 基于Android平台的汽车租赁系统:项