內存泄露分析之as monitors、MAT、leakcanary 使用
1 android studio monitors
這是android studio自帶的工具
在當前進程下,點擊如下圖標,觸發gc操作
Gc後再點擊旁邊的按鈕,收集java堆內存的信息,點擊幾分鐘之後會生成內存信息文件
生成文件之後android studio會自動跳轉到當前界面,如下圖
這裏顯示了內存中所有的類和對象信息
點擊如圖按鈕,可以按包名顯示類信息
當前我的包名是com.veryfitplus.aidu.如下圖,找到我當前類所在信息
這是我點擊ActiveDetailActivity界面後又返回主界面,如此操作幾次之後的內存信息。
ClassName:表示類名
TotalCount: 內存中該類的對象個數
Heap Count:堆內存中該類的對象個數
Sizeof:每個該實例佔用的內存大小
Shallow size:所有該類的實例佔用的內存大小
Retained Size:釋放該對象後,節省的內存大小
depth:深度,從任一GC Root點到該實例的最短跳數
Shallow Size:對象本身內存大小
Dominating Size:該實例可支配的內存大小
可以看到當我返回主界面後ActiveDetaiLActivity並沒有銷燬,因此可以知道這個Acitvity已經泄露了。
點擊要觀察的類,右邊界面顯示了類的對象信息,點擊右邊的對象,則下邊的界面顯示當前對象被引用的地方,看到很多地方有該acitivty的引用,不過一般系統的控件或者系統的類持有它都不會造成內存泄露,主要看有沒有其他地方的類是否有引用它並且在onDestory方法裏面釋放它,由下圖可以看出,一個百度map的裏面的類持有它的引用,因爲我這個界面引用了地圖控件,地圖裏面接入了百度地圖控件,於是查看該類的方法,果然onDestory方法裏面沒有執行地圖控件的onDestory方法,導致退出後地圖還持有該acitivity的引用導致該acitivity內存泄露了。加上方法後重復之前的操作,在返回主頁的時候該acitivity實例就沒有了。
MAT檢測
首先也要生成hprof文件。在as裏面直接生成的hprof文件不是標準的hprof文件,點擊左邊的Captures按鈕,切換成Captures界面,然後在你需要分析的hprof文件上面右擊,有個導出標準的hropf按鈕,點擊後會生成一個標準的hprof文件
在MAT中打開剛轉出來的hprof文件,如圖,點擊Hisogram按鈕
這裏也是列舉了所有的類和對象信息,不過這裏的信息太多,而我們一般檢查內存泄露的對象都是查看activity,因此在上面可以直接輸入acitivity過濾.後面Objects表示該類在內存中有多少個對象,過濾後可以查看該類有3個對象。
點擊右鍵,選擇Path To GC Roots-> excluede all phantom/weak/soft etc. References ,這裏選擇這個是所有的虛引用/軟引用/弱引用都排除掉,因爲只有強引用纔會造成內存泄漏
點擊後就只剩下一個,立刻清除明白導致內存泄漏的罪魁禍首了。
leakcanary集成檢測
這個是集成在APP裏面的,首先是添加依賴庫
然後是初始化,一般是在Application裏面初始化的。
然後在要檢測的類的onDestroy方法添加添加檢測。一般寫在BaseActivity裏面,這樣不用每個類都寫一遍了。
也是反覆操作幾遍之後,如果有內存泄漏,就會彈出提示框提示有內存泄漏。點擊進去之後可以看到具體的內存泄漏信息.由於也點擊了其他界面,可以看到不止一個acitivity內存泄漏。
點擊相應的要看的內存泄漏的類,下面可以看到有引用它的地方。點擊+好展開可以看到,也是baidu引起的和之前的分析工具一致。
總結:monitors是android studio自帶的工具,不用下載,不用集成,使用簡單,但是分析起來沒MAT好用。MAT需下載,需標準的hprof文件,分析功能比monitos強大。leakcanary 需集成,好處是可以已經自動分析出泄漏原因。
MAT官網下載地址:https://www.eclipse.org/mat/
leakcanary github地址:https://github.com/square/leakcanary