日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android内存泄漏检测工具,Android内存泄漏的检测工具——LeakCanary

發布時間:2023/12/3 Android 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。