android 内存泄露分析 Lint StrictMode LeakCanary Memory Analyzer (MAT)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010023795/article/details/53888511

在安卓开发当中经常会碰到各种异常错误,尤其是OOM最让人恼火,接下来记录一下在日常开发中用到的几种帮助工具,能让我们更好地查找内存泄露出处。

1.首先我们来找到内存泄露的定位:静态定位
静态代码的查找:androidStudio中就集成了此工具:
静态代码分析工具——-Lint
使用方式很简单 Analyze -> Inspect Code 然后选择想要扫面的区域即可
这里写图片描述

点击之后会弹出选择框,我们可以根据自己需要选择需要检查的地方

这里写图片描述
点击之后我们查看编译器下方的 Inspection就可以查看到工具给我们的分析
这里写图片描述

Lint工具的玩法还有很多,包括各种错误提示,以及编译提示,还可以查找出未使用资源等。总的来说对查找提示检测都是很不错的一款工具,设置使用方法也很简单这里不多说只随意介绍一下:Seting—Inspections— 然后再搜索框搜索设置:
这里写图片描述
查找res目录下未被使用的xml以及图片资源等:
在项目中,点击菜单栏的Analyze -> Run Inspection by Name …
这里写图片描述
弹出框输入 unused resources你需要查找的
这里写图片描述
这里的设置如上面介绍的一样:
这里写图片描述
点击确定就可以在编译器的下方看到结果了。

2.接下来介绍 严苛模式 —— StrictMode
StrictMode 是 Android 系统提供的 API ,在开发环境下引入可以更早的暴露发现问题,能够动态的检测内存泄露。
官方链接https://developer.android.google.cn/reference/android/os/StrictMode.html
严苛模式的开启可以放在Application或者Activity以及其他组件的onCreate方法。为了更好地分析应用中的问题,建议放在Application的onCreate方法中。一般 StrictMode 只在测试环境下启用,到了生产环境就会进行关闭,通常我们都会借助 BuildConfig.DEBUG 来实现,下面简单的使用:

这里写图片描述
这样添加好代码之后debug运行,有问题就会弹出对话框,在过滤日志的地方加上 StrictMode 的过滤 Tag 就可以看到报错的信息了,根据信息提示就可以发现出问题的地方。

3.使用Memory Analyzer (MAT)分析 可以从官网下载获得 http://eclipse.org/mat/downloads.php
首先我们要先利用androidStudio 获得hprof文件
这里写图片描述
这里写图片描述
保存生成的文件

用AndroidStudio打开刚刚保存的hprof文件,将文件直接拖进AndroidStudio中即可,选后选择Package Tree View,内存使用情况就是以包名分类。在界面中找到你的应用程序的包名,打开即可看到内存的使用情况,自己写的类一目了然!如果有内存泄露,很容易看到。
这里写图片描述

但是这样还是比较麻烦,因为我们要把生成的hprof重新拖入AS编译器中,下面我们利用Android Studio中的Android Monitor 工具来分析生成 hprof文件:
这里写图片描述

点击操作自动生成hprof文件将会在AS编译器中显示,文件件以包名+时间来命名
这里写图片描述

这样我们可以通过查找分析来找到内存泄漏的地方,但是这样可能还是比较繁琐所以我们需要借助MAT工具(下载地址http://www.eclipse.org/mat/downloads.php)来更进一步的准确找到内存泄漏的地方:因为MAT是eclipse的工具,我们androidStudio生成的hprof文件是识别不了的所以我们需要转换一下,步骤如下:

这里写图片描述

打开我们的MAT
这里写图片描述
接下来这里写图片描述

点击内存泄露分析
这里写图片描述
由于我们内存泄漏一般发生在Activity中,因此只需要查找Activity即可。
点击下图中标记的QQL图标 输入 select * from instanceof android.app.Activity
类似于 SQL语句 查找 Activity相关的信息 点击 红色叹号执行后 如下图所示:
这里写图片描述

这里写图片描述
最后到这里可以看到内存泄露的根源
这里写图片描述

LeakCanary 是Square 公司出品的内存分析工具,官方地址如下:[https://github.com/square/leakcanary/](https://github.com/square/leakcanary/)
中文网https://www.liaohuqiu.net/cn/posts/leak-canary-read-me/

LeakCanary使用心得:当内存泄漏发生时,LeakCanary 会弹出通知栏提示并生成对应的堆存储信息记录,这让我们对隐蔽的内存泄漏问题有了更加直观的感觉,但从实际使用来看,LeakCanary 的每个提示也并非是真正存在内存泄漏问题,要想确定是否存在问题我们还需要借助 MAT 来进行最后的确定。
Android 系统本身就存在一些问题导致应用内存泄漏,LeakCanary 的 AndroidExcludedRefs 类帮助我们处理了不少这类问题。

简介使用:`开始使用

在 build.gradle 中加入引用,不同的编译使用不同的引用:

dependencies {
debugCompile ‘com.squareup.leakcanary:leakcanary-android:1.3’
releaseCompile ‘com.squareup.leakcanary:leakcanary-android-no-op:1.3’
}
在 Application 中:

public class ExampleApplication extends Application {

@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
这样,就万事俱备了! 在 debug build 中,如果检测到某个 activity 有内存泄露,LeakCanary 就是自动地显示一个通知。`

如何使用:

使用 RefWatcher 监控那些本该被回收的对象。

RefWatcher refWatcher = {...};

// 监控
refWatcher.watch(schrodingerCat);
LeakCanary.install() 会返回一个预定义的 RefWatcher,同时也会启用一个 ActivityRefWatcher,用于自动监控调用 Activity.onDestroy() 之后泄露的 activity。

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);
  }
}
使用 RefWatcher 监控 Fragment:

public abstract class BaseFragment extends Fragment {

  @Override public void onDestroy() {
    super.onDestroy();
    RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());
    refWatcher.watch(this);
  }
}

最后需要注册:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
>
<application android:name="com.example.DebugExampleApplication">
<service android:name="com.example.LeakUploadService" />
</application>
</manifest>

参考链接:
1.https://mp.weixin.qq.com/s/kNJn-1SbDdm1iNq19wGEWA
2.http://blog.csdn.net/mynameishuangshuai/article/details/51742375#t17严苛模式
3.http://blog.csdn.net/u012760183/article/details/52068490 MAT分析
4.http://www.jianshu.com/p/216b03c22bb8MAT分析


猜你喜欢

转载自blog.csdn.net/u010023795/article/details/53888511