Android内存泄漏分析及实践(三)-leakCanary
2016-03-17 16:52
453 查看
Android内存泄漏分析及实践(三)-leakCanary
android应用程序本身系统分配的内存很少,一旦发生泄漏,程序很快就会变得非常卡顿,直至OOM崩溃。程序猿需要在Coding的时候注意静态变量的使用,以及注册监听器记得反注册,否则当程序出现内存泄露之后再去分析就变得相当困难。通过code review很难发现深层次的内存泄露问题。当内存泄露真的出现了,我们可以借助工具去分析。常见的内存泄露分析工具有MAT和LeakCanary。
MAT和LeakCanary区别
MAT是一个非常出色的内存分析工具,但是使用非常麻烦,它是分析指定进程所有的对象,工具本身并不知道到底哪些对象出现了内存泄露,需要使用者(程序猿)分析得出。好处是不会有代码侵入性。leakCanary是一个开源软件,在github地址为https://github.com/square/leakcanary。该工具包含debug和release两个版本。debug版本可以将泄露对象显示在DisplayLeakActivity中,而release不会展示,可以将泄露信息传送到指定服务器。要使用该工具,我们工程需要依赖leakCanary aar,并且需要修改我们的应用程序。LaekCanary只能监听Activity和Fragment内存泄露。
LeakCanary使用介绍
步骤1: 修改 build.gradle,使工程依赖leakCanary:dependencies { compile 'com.squareup.leakcanary:leakcanary-android:1.3.1' compile 'com.squareup.leakcanary:leakcanary-watcher:1.3.1' }
步骤2: 修改自定义Application,注册leakCanary:
public class ExampleApplication extends Application { private static RefWatcher refWatcher; @Override public void onCreate() { super.onCreate(); refWatcher = LeakCanary.install(this); } public static RefWatcher getRefWatcher() { return refWatcher; } }
通过以上两步,leakCanary就能自动检测程序中所有Activity是否发生内存泄露。当检测到内存泄露,会通过通知栏通知用户,可以在DisplayLeakActivity中查看泄露信息,包括泄露对象,泄露内存大小,以及引用树。通过以上步骤我们仅仅能检测Activity,为了检测Fragment,我们需要创建一个父类BaseFragment extends Fragment,然后所有Fragment继承BaseFragment。
步骤3: 修改BaseFragment,检测fragment内存泄露
public class BaseFragment extends Fragment{ @Override public void onDestroy() { super.onDestroy(); RefWatcher refWatcher = DriverApplication.getRefWatcher(); refWatcher.watch(this); } }
通过以上三个步骤,leakCanary就可以自动检测Activity和Fragment了。最后附上一张内存泄露分析结果图片:
相关文章推荐
- Android之简单本地音乐播放器
- Android开发历程_2(实现简单的乘法计算)
- 高德地图-Android-逆地理转换:经纬度转换成地址
- ViewPager中属性android:flipInterval="30" android:persistentDrawingCache="animation"
- 关于Android Studio 错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface或enum
- Android开发资源获取国内代理
- Android 异步加载图片,使用LruCache和SD卡或手机缓存
- Android@id和@+id
- 【进阶篇】Android学习笔记——TextInputLayout
- Android开发培训之如何使用该框架来构建自己的应用
- MVP模式在Android项目中的使用
- Android 事件分发
- Android---08---布局与单位
- android studio从布局文件中提取style
- Android屏幕适配
- Android之环境搭建下载路径
- android文件上传到服务器
- android开发 多线程
- [置顶] JAVA中 错误代码是 the public type must be defined in its own file 解决方法 android开发 java编程
- 关于mtk Android打开串口权限问题