內存分析工具之LeakCanary2.4使用整理

目錄

 

1.LeakCanary是什麼?

2.LeakCanary有什麼優點?

3.LeakCanary如何引入到項目中?

3.1引入leakcanary-android依賴

3.2確認LeakCanary是否運行

3.3LeakCanary自動檢測以下對象的泄漏

4.LeakCanary如何分析內存泄漏?

4.1測試內存泄漏用例

4.2複雜的內存泄漏通過分析hprof文件


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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章