国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

記錄對內存泄露(OOM)的處理

2019-11-09 17:36:29
字體:
來源:轉載
供稿:網友

自己在Android開發中也會時常遇到OOM的問題,但是在此之前,我對他的處理沒有臺看重,因為我還是個新手,沒有開發過完整的APP項目,今天記錄自己在網上看到的大牛整理出來對Android和java的內存泄露處理方法,也是希望自己在以后的開發道路上能夠很好避免此類問題。

現在處理OOM常用的工具便是 LeakCanary。

先介紹一下LeakCanary在Android Studio中的使用方法:

1)在 build.gradle 中加入一下依賴:分為debug和release兩個引用方式

dependencies {   debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'   releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3' }2)使用RefWatcher監控那些本該被回收的對象,具體使用如下:

1.在application中,

public class ExampleApplication extends Application {  public static RefWatcher getRefWatcher(Context context) {    ExampleApplication application = (ExampleApplication) context.getApplicationContext();    return application.refWatcher;  }  PRivate RefWatcher refWatcher;  @Override   public void onCreate() {    super.onCreate();    refWatcher = LeakCanary.install(this);  }}

其中LeakCanary.install() 會返回一個預定義的 RefWatcher,同時也會啟用一個 ActivityRefWatcher,用于自動監控調用 Activity.onDestroy() 之后泄露的 activity。

2.監控Activity或者Fragment

public abstract class BaseFragment(Activity) extends Fragment( Activity){  @Override public void onDestroy() {    super.onDestroy();    RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());    refWatcher.watch(this);  }}

工作機制:

RefWatcher.watch() 創建一個 KeyedWeakReference 到要被監控的對象。

然后在后臺線程檢查引用是否被清除,如果沒有,調用GC。

如果引用還是未被清除,把 heap 內存 dump 到 APP 對應的文件系統中的一個 .hprof 文件中。

在另外一個進程中的 HeapAnalyzerService 有一個 HeapAnalyzer 使用HAHA 解析這個文件。

得益于唯一的 reference key, HeapAnalyzer 找到 KeyedWeakReference,定位內存泄露。

HeapAnalyzer 計算 到 GC roots 的最短強引用路徑,并確定是否是泄露。如果是的話,建立導致泄露的引用鏈。

引用鏈傳遞到 APP 進程中的 DisplayLeakService, 并以通知的形式展示出來。

鏈接:

這里是我學習的網址:https://www.liaohuqiu.net/cn/posts/leak-canary-read-me/,如果需要了解更多可以去看一下!

一個非常簡單的 LeakCanary demo: https://github.com/liaohuqiu/leakcanary-demo


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 玉田县| 文山县| 阳信县| 华蓥市| 张家口市| 囊谦县| 怀化市| 金门县| 方正县| 广南县| 襄汾县| 雅安市| 上林县| 新竹县| 伊吾县| 乌鲁木齐市| 台前县| 建平县| 灵台县| 炎陵县| 肃宁县| 绵阳市| 盱眙县| 房产| 湖南省| 灌阳县| 志丹县| 东丽区| 双城市| 开原市| 容城县| 垣曲县| 西宁市| 永春县| 万荣县| 焦作市| 兖州市| 大同市| 遵义县| 略阳县| 昆明市|