目錄
1.LeakCanary是什麼?
LeakCanary是一個爲了Android使用的內存檢測分析工具;
2.LeakCanary有什麼優點?
引入LeakCanary2.4的Android庫,出現簡單的內存泄漏可以方便通過打開Leaks內存泄漏文件,快速定位內存泄漏的位置,對於複雜得多內存泄漏問題可以通過查看LeakCanary庫生成的hprof文件進行分析;
引入方便,可視化內存泄漏問題關聯關係;
3.LeakCanary如何引入到項目中?
3.1引入leakcanary-android依賴
在app的module中的build.gradle文件中引入leakcanary-android依賴;
dependencies {
// debugImplementation because LeakCanary should only run in debug builds.
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.4'
}
3.2確認LeakCanary是否運行
在LogCat控制檯查看如下日誌確認LeakCanary已經運行;
D LeakCanary: LeakCanary is running and ready to detect leaks
3.3LeakCanary自動檢測以下對象的泄漏
a.已銷燬的Activity實例;
b.已銷燬的Fragment實例;
c.已銷燬的片段View實例;
d.已經清除的ViewModel實例;
4.LeakCanary如何分析內存泄漏?
4.1測試內存泄漏用例
匿名耗時內部線程類造成的內存泄漏-匿名線程內部類會持有外部Activity的實例引用導致Activity實例無法釋放-垃圾回收
public class MemoryTestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory_test);
anonymousInnerClass();
}
//匿名內部類持有MemoryTestActivity實例引用
public void anonymousInnerClass(){
new Thread(){
@Override
public void run() {
//執行異步處理
SystemClock.sleep(240000);
}
}.start();
}
}
測試方法打開關閉MemoryTestActivity頁面;
我們打開測試app,打開關閉MemoryTestActivity頁面,通知欄會出現如下內存泄漏通知,桌面會出現Leaks圖標;
點擊通知或者Leaks圖標查看內存泄漏詳細信息:
通過如上內存泄漏描述,很容易發現內存泄漏原因是由於MemoryTestActivity關閉時,由於Thread匿名內部線程持有MemoryTestActivity實例的引用而無法進行垃圾回收導致內存泄漏;
4.2複雜的內存泄漏通過分析hprof文件
藉助匿名耗時內部線程類造成的內存泄漏生成的hprof文件進行分析
菜單欄:View-Tool Windows-Device File Explorer,找到Download文件夾下的當前測試包下內存檢測堆文件hprof文件:
可以看到一些內存檢測文件hprof, 雙擊打開最新的hprof文件:
以上是打開hprof文件結果,點擊Analyzer Task分析hprof文件;
解析hprof文件以後每個字段的含義,方面進行內存分析;
名稱 | 描述 |
Class name | 類名 |
Total Count | 該類的實例總數 |
Heap Count | 所選擇的堆中該類的實例的數量 |
Sizeof | 單個實例所佔空間大小(如果每個實例所佔空間大小不一樣則顯示0) |
Shallow Size | 堆裏所有實例大小總和(Heap Count * Sizeof) |
Retained Size | 該類所有實例所支配的內存大小 |
Instance | 具體的實例 |
Reference Tree | 所選實例的引用,以及指向該引用的引用。 |
Depth | GC根節點到所選實例的最短路徑的深度 |
Shallow Size | 所選實例的大小 |
Dominating Size | 所選實例所支配的內存大小 |
點擊Analyzer Task分析hprof文件:
Leaked Activities : 有內存泄漏的activities
Duplicated Strings : 重複定義的字符串(一般可以不理會)
以上是LeakCanary2.4基本使用方法,是否很簡單;
參考:
https://blog.csdn.net/baidu_31093133/article/details/81779711
https://square.github.io/leakcanary/fundamentals-how-leakcanary-works/