android内存泄漏检测工具,Android内存泄漏的检测工具——LeakCanary
首先了解什么是內存泄露html
http://liuwangshu.cn/application/performance/ram-3-memory-leak.htmlandroid
1Leakcancary的優點
LeakCanary是一個可視化的內存泄露分析工具,他具有如下優點app
·簡單:只需設置一段代碼便可,打開應用運行一下就可以發現內存泄露。而MAT分析須要Heap Dump,獲取文件,手動分析等多個步驟。ide
·易于發現問題:在手機端便可查看問題即引用關系,而MAT則須要你分析,找到Path To GC Roots等關系。工具
·人人可參與:開發人員,測試測試,產品經理基本上只要會用App就有可能發現問題。而傳統的MAT方式,只有部分開發者才有精力和能力實施。測試
2.使用說明
2.1 在build.gradle中添加依賴gradle
首先,在必須在對應的app模塊的gradle添加對應的庫,在其余module模塊添加無效ui
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'
}
到這里,就添加了對他的依賴。這里說明一下,使用其余版本可能會由于版本問題致使報錯,建議使用最新版本,也就是這個1.5.4this
2.2 在application中配置spa
public class BaseApplication extends Application {
private RefWatcher refWatcher;
@Override
public void onCreate() {
super.onCreate();
refWatcher= setupLeakCanary();//2
}
private RefWatcher setupLeakCanary() {
if (LeakCanary.isInAnalyzerProcess(this)) {
return RefWatcher.DISABLED;
}
return LeakCanary.install(this);//1
}
public static RefWatcher getRefWatcher(Context context) {
BaseApplication leakApplication = (BaseApplication) context.getApplicationContext();
return leakApplication.refWatcher;
}
}
在注釋2處,,完成對LeakCancary的安裝,通過以上兩個步驟,你的手機界面出現
這個黃色的圖標就是咱們的監控工具
2.3 檢測activity內存泄漏問題,原理是application中監控著全部activity生命周期在activity的onDestory中
@Override
protected void onDestroy() {
super.onDestroy();
RefWatcher refWatcher = BaseApplication.getRefWatcher(this);//1
refWatcher.watch(this);
}
Activity生命周期結束的時候,若是你的activity發生內存泄漏,狀態欄會提示你
那么,黃色的應用 ?Leaks中
會把內存泄漏的詳情告訴你,像這里就是由于個人TestActivity中開了LeakThread這個線程,形成了內存泄漏
泄漏內存是115kb
2.4 監控的對象當咱們須要對某個對象進行監控時,
BaseApplication.getRefWatcher().watch(sleaky)
其中sleaky就是咱們要檢測的對象
那么,哪些是須要咱們檢測的對象呢
默認狀況下,是對Activity進行了檢測。另外一個須要監控的重要對象就是Fragment實例。由于它和Activity實例同樣可能持有大量的視圖以及視圖須要的資源
其余也能夠監控的對象
BroadcastReceiver,Service,其余有生命周期的對象,直接間接持有大內存占用的對象(即Retained Heap值比較大的對象)
什么時候進行監控
首先,咱們須要明確什么是內存泄露,簡而言之,某個對象在該釋放的時候因為被其余對象持有沒有被釋放,于是形成了內存泄露。
所以,咱們監控也須要設置在對象(很快)被釋放的時候,如Activity和Fragment的onDestroy方法。
一個錯誤示例,好比監控一個Activity,放在onCreate就會大錯特錯了,那么你每次都會收到Activity的泄露通知。
以上就是LeakCancary的使用方法
3.LeakCanary的原理
Android 應用的整個生命周期由其組件的生命周期組成,以下圖中所示。用戶使用應用的過程當中,在不一樣界面之間跳轉,每一個界面都經歷著”生死“的轉換,可在此創建檢測點。Activity/Fragment 都有 onDestory() 回調方法, 進入此方法后,Activity/Fragment生命周期結束,應該被回收。
簡述聲明周期
而后咱們須要解決:如何獲得未被回收的對象。ReferenceQueue+WeakReference+手動調用 GC可實現這個需求。
WeakReference 建立時,傳入一個 ReferenceQueue 對象。當被 WeakReference 引用的對象的生命周期結束,一旦被 GC 檢查到,GC 將會把該對象添加到 ReferenceQueue 中,待ReferenceQueue處理。當 GC 事后對象一直不被加入 ReferenceQueue,它可能存在內存泄漏。
得到未被回收的 Object
找到了未被回收的對象,如何確認是否真的內存泄漏?這里能夠將問題轉換為:未被回收的對象,是否被其余對象引用?找出其最短引用鏈。VMDebug + HAHA 完成需求。
VM 會有堆內各個對象的引用狀況,并能以hprof文件導出。HAHA 是一個由 square 開源的 Android 堆分析庫,分析 hprof 文件生成Snapshot對象。Snapshot用以查詢對象的最短引用鏈。
解析hprof
找到最短引用鏈后,定位問題,排查代碼將會事半功倍。
以下泳道圖分析, LeakCanary 各個模塊如何配合達到檢測目的。
泳道圖
總結
以上是生活随笔為你收集整理的android内存泄漏检测工具,Android内存泄漏的检测工具——LeakCanary的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UE4内存检测工具使用
- 下一篇: Linux:内存泄漏检测工具--Valg