Android內(nèi)存泄漏及檢測工具

背景

前幾天寫了一篇文章關(guān)于Android幾種常見的內(nèi)存泄漏問題和解決方法,還沒看的朋友也可以先看一下。那么當我們真正遇到不知道問題的內(nèi)存泄漏的時候該怎么去分析和檢測它呢?

內(nèi)存泄漏檢測工具

利用MAT來分析內(nèi)存泄漏

首先我們就拿一個最簡單的內(nèi)存泄漏的例子來分析一下

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.首先我們手動出發(fā)一下GC然后查看Dump


Android-Monitors.png

突然發(fā)現(xiàn)最新的AndroidStudio沒有上面的了,也有可能是我沒找到,但是在tools里面有Monitors,打開是下面的界面,也可以導出hprof文件

image.png

導出之后的文件是不能直接被MAT識別的需要通過hprof-conv命令來轉(zhuǎn)換一下,這個是Android SDK提供的工具,在plafrom-tools目錄下

hprof-conv com.aotuman.leak.hprof(原文件) com.aotuman.leak.hprof(輸出文件)

然年后我們就可以利用MAT來打開文件進行內(nèi)存分析了:

image.png

從圖我們可看到MAT提供了很多功能,但是最常用的只有Histogran和Dominator Tree.
Histogran:可以直觀的看出內(nèi)存中不同類型的buffer的數(shù)量和占用的內(nèi)存大小
Dominator Tree:把內(nèi)存中的對象按照從大到小的順序進行排序,并且可以分析對象之間的引用關(guān)系,內(nèi)存泄漏分析就是通過他來實現(xiàn)的
下面兩張圖就是他倆的界面:

Histogran.png
Dominator Tree.png

那么我們到底應(yīng)該怎么來查看內(nèi)存泄漏呢,比如我們的Demo我們大概知道是MainActivity產(chǎn)生了內(nèi)存泄漏,我們可以搜索,然后按照下圖的方式來查看他的引用(在Histogram和Dominator_Tree兩個界面都可以這么去查看引用關(guān)系):


image.png

查看完之后我們就會看到這個界面:

image.png

從圖中我們就可以看到,是因為sContext導致了內(nèi)存泄漏。

利用LeakCanary來查看內(nèi)存泄漏

這種方式比較簡單和直觀,有內(nèi)存泄漏的時候他會之間提示你造成內(nèi)存泄漏的引用鏈。
使用方法也很簡單:

LeakCancary.png

下面是發(fā)生內(nèi)存泄漏之后,手機上的提示,它會彈出在通知欄。


image.png

是不是很簡單明了,不需要我們自己去分析和查找,只要你是期間出現(xiàn)內(nèi)存泄漏它都會提示給你。
當然如果有想深入研究的同學可以去Google一下,查看它的源碼,分析一下實現(xiàn)原理,這里就不展開了。

總結(jié)

以上是我常用的兩種方法,如果大家有其他更好的可以留言告訴樓主,我也可以學習一下,總的來說內(nèi)存泄漏是一個相對較為復雜的問題,但是只要我們掌握了一定的技巧那么解決起來也是很簡單的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容