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

歡迎訪問 生活随笔!

生活随笔

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

Android

LeakCanary——消除Android中的内存泄露

發布時間:2025/3/20 Android 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeakCanary——消除Android中的内存泄露 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

##LeakCanary

####簡介 LeakCanary是Square公司最近公布的開源項目,旨在消除Android中的內存泄露(Memory Leak),項目地址猛戳這里。

####使用 LeakCanary的使用也非常之簡單,僅需要在Application中添加一行代碼

public class ExampleApplication extends Application {@Override public void onCreate() {super.onCreate();LeakCanary.install(this);} }

當然依賴也是必須的

dependencies {debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'}

在這里分別使用了debugCompile和releaseComile是為了在開發測試和發布時,發現內存泄露執行不同Action。

當使用debug編譯時,如果Activity發生了內存泄露,LeanCanary會自動發送Notification提醒你,點擊之后會展現內存泄露的詳細信息,列出相關的對象引用。 并且還會在logcat中打印相關的信息:

In com.example.leakcanary:1.0:1 com.example.leakcanary.MainActivity has leaked:

  • GC ROOT thread java.lang.Thread.<Java Local> (named 'AsyncTask #1')
  • references com.example.leakcanary.MainActivity$3.this$0 (anonymous class extends android.os.AsyncTask)
  • leaks com.example.leakcanary.MainActivity instance
  • Reference Key: e71f3bf5-d786-4145-8539-584afaecad1d
  • Device: Genymotion generic Google Nexus 6 - 5.1.0 - API 22 - 1440x2560 vbox86p
  • Android Version: 5.1 API: 22
  • Durations: watch=5086ms, gc=110ms, heap dump=435ms, analysis=2086ms

如果你認為LeakCanary能做的只有這樣,那你就大錯特錯了。只要你想,它還可以監視任何對象。

RefWatcher refWatcher = LeakCanary.install(this);

然后在你覺得對象要被虛擬機回收的時機讓RefWatcher觀察這個對象:

refWatcher.watch(obj)

####結果 在使用LeakCanary之后,Square聲稱減少了94%OOM產生的crash,甚至還發現了Android SDK中的內存泄露。

####原理

其實LeakCanary的原理也很簡單,簡單來說就是創建了一個WeakReference對象,如果觸發了GC之后這個對象存在,則說明發生了內存泄露。接著dump內存,分析引用,發送通知。

  • RefWatcher.watch()在觀察對象中添加一個KeyedWeakReference。
  • 接著過一段時間,后臺線程會檢查觀察對象是否還存活著,如果是,則觸發GC。
  • 如果觀察對象仍然存在,則表示發生了內存泄露。LeakCanary會dump內存生成.hprof文件在應用文件目錄下。
  • 在另一個進程中啟動HeapAnalyzerService ,HeapAnalyzer借助HAHA來分析內存。
  • HeapAnalyzer在dump文件中找到KeyedWeakReference,并且找到泄露的引用。
  • HeapAnalyzer計算到GG Root的最短路徑,并判斷是否是一個的內存泄露。如果是,生成引用的路徑鏈。
  • 最終接口會發送到app進程中的DisplayLeakService,執行接下來的操作,debug環境默認是發送一個Notification。
  • #####參考地址

    • https://github.com/square/leakcanary
    • https://corner.squareup.com/2015/05/leak-canary.html

    轉載于:https://my.oschina.net/u/724985/blog/413414

    總結

    以上是生活随笔為你收集整理的LeakCanary——消除Android中的内存泄露的全部內容,希望文章能夠幫你解決所遇到的問題。

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