首页 > 学院 > 开发设计 > 正文

记录对内存泄露(OOM)的处理

2019-11-09 18:40:55
字体:
来源:转载
供稿:网友

自己在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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表