內存泄露分析之as monitors、MAT、leakcanary 使用

內存泄露分析之as monitorsMATleakcanary 使用

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引起的和之前的分析工具一致。

 

總結:monitorsandroid studio自帶的工具,不用下載,不用集成,使用簡單,但是分析起來沒MAT好用。MAT需下載,需標準的hprof文件,分析功能比monitos強大。leakcanary 需集成,好處是可以已經自動分析出泄漏原因。

 

MAT官網下載地址:https://www.eclipse.org/mat/

leakcanary github地址:https://github.com/square/leakcanary

 

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