背景
前幾天寫了一篇文章關(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

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

導出之后的文件是不能直接被MAT識別的需要通過hprof-conv命令來轉(zhuǎn)換一下,這個是Android SDK提供的工具,在plafrom-tools目錄下
hprof-conv com.aotuman.leak.hprof(原文件) com.aotuman.leak.hprof(輸出文件)
然年后我們就可以利用MAT來打開文件進行內(nèi)存分析了:

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


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

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

從圖中我們就可以看到,是因為sContext導致了內(nèi)存泄漏。
利用LeakCanary來查看內(nèi)存泄漏
這種方式比較簡單和直觀,有內(nèi)存泄漏的時候他會之間提示你造成內(nèi)存泄漏的引用鏈。
使用方法也很簡單:

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

是不是很簡單明了,不需要我們自己去分析和查找,只要你是期間出現(xiàn)內(nèi)存泄漏它都會提示給你。
當然如果有想深入研究的同學可以去Google一下,查看它的源碼,分析一下實現(xiàn)原理,這里就不展開了。
總結(jié)
以上是我常用的兩種方法,如果大家有其他更好的可以留言告訴樓主,我也可以學習一下,總的來說內(nèi)存泄漏是一個相對較為復雜的問題,但是只要我們掌握了一定的技巧那么解決起來也是很簡單的。