天天看點

Android記憶體洩漏檢測工具

背景

前幾天寫了一篇文章關于Android幾種常見的記憶體洩漏問題和解決方法,還沒看的朋友也可以先看一下。那麼當我們真正遇到不知道問題的記憶體洩漏的時候該怎麼去分析和檢測它呢?

記憶體洩漏檢測工具

利用MAT來分析記憶體洩漏

首先我們就拿一個最簡單的記憶體洩漏的例子來分析一下

public class MainActivity extends Activity {
    private static Context sContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sContext = this;
    }
}
           

1.首先我們手動出發一下GC然後檢視Dump

Android記憶體洩漏檢測工具

突然發現最新的AndroidStudio沒有上面的了,也有可能是我沒找到,但是在tools裡面有Monitors,打開是下面的界面,也可以導出hprof檔案

Android記憶體洩漏檢測工具

導出之後的檔案是不能直接被MAT識别的需要通過hprof-conv指令來轉換一下,這個是Android SDK提供的工具,在plafrom-tools目錄下

hprof-conv com.aotuman.leak.hprof(原檔案) com.aotuman.leak.hprof(輸出檔案)
           

然年後我們就可以利用MAT來打開檔案進行記憶體分析了:

Android記憶體洩漏檢測工具

從圖我們可看到MAT提供了很多功能,但是最常用的隻有Histogran和Dominator Tree.

Histogran:可以直覺的看出記憶體中不同類型的buffer的數量和占用的記憶體大小

Dominator Tree:把記憶體中的對象按照從大到小的順序進行排序,并且可以分析對象之間的引用關系,記憶體洩漏分析就是通過他來實作的

下面兩張圖就是他倆的界面:

Android記憶體洩漏檢測工具
Android記憶體洩漏檢測工具

那麼我們到底應該怎麼來檢視記憶體洩漏呢,比如我們的Demo我們大概知道是MainActivity産生了記憶體洩漏,我們可以搜尋,然後按照下圖的方式來檢視他的引用(在Histogram和Dominator_Tree兩個界面都可以這麼去檢視引用關系):

Android記憶體洩漏檢測工具

檢視完之後我們就會看到這個界面:

Android記憶體洩漏檢測工具

從圖中我們就可以看到,是因為sContext導緻了記憶體洩漏。

利用LeakCanary來檢視記憶體洩漏

這種方式比較簡單和直覺,有記憶體洩漏的時候他會之間提示你造成記憶體洩漏的引用鍊。

使用方法也很簡單:

Android記憶體洩漏檢測工具

下面是發生記憶體洩漏之後,手機上的提示,它會彈出在通知欄。

Android記憶體洩漏檢測工具

是不是很簡單明了,不需要我們自己去分析和查找,隻要你是期間出現記憶體洩漏它都會提示給你。

當然如果有想深入研究的同學可以去Google一下,檢視它的源碼,分析一下實作原理,這裡就不展開了。

總結

以上是我常用的兩種方法,如果大家有其他更好的可以留言告訴樓主,我也可以學習一下,總的來說記憶體洩漏是一個相對較為複雜的問題,但是隻要我們掌握了一定的技巧那麼解決起來也是很簡單的。