Android之内存泄漏
开篇之前,我们要先理解:什么是内存泄漏。
百度百科:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
内存泄漏的影响上面也说的很清楚了,所以我们需要发现内存泄漏,并解决内存泄漏。
在Android中,要如何发现内存泄漏呢?
我目前有用到两种方法,第一种是用Android Studio,这个方法可以检测Activity的内存泄漏;第二种是使用LeakCanary,可以检测所有内存泄漏。
第一种方法:
我目前用的是Android Studio,Android Studio有一个自带的检测内存泄漏的方法。
首先,打开Monitor界面:
![](http://upload-images.jianshu.io/upload_images/2915863-2a1852abdc10b214.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
然后,打开APP,测试APP有内存泄漏嫌疑的界面,点击下图按钮,强制GC:
![](http://upload-images.jianshu.io/upload_images/2915863-e794fe311b9f739b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
接下来,点击下图所示按钮,进入HPROF Viewer界面,查看Java的Heap:
![](http://upload-images.jianshu.io/upload_images/2915863-755e12c029a1945f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/2915863-b03e5f747f463e80.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
然后,点击上图所示的“Analyzer Tasks”按钮,打开Analyzer Tasks界面:
![](http://upload-images.jianshu.io/upload_images/2915863-60630115b8ef4313.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
点击上图所示按钮,开始分析内存泄漏,结果如下图所示:
![](http://upload-images.jianshu.io/upload_images/2915863-d5fd78b91128d092.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如上图所示,出现了两个内存泄漏,可以根据箭头所指区域的信息修改内存泄漏问题。
第二种方法:
LeakCanary是一个开源的在debug版本中检测内存泄漏的java库。
GitHub地址为:https://github.com/square/leakcanary
根据GitHub上的说明文档,集成LeakCanary:
在app的build.gradle中,加入以下代码:
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
}
在自定义Application中加入以下代码:
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(this);
// Normal app init code...
}
}
然后,就可以直接使用了。
LeakCanary除了会在界面中显示泄漏信息之外,Log中也一样会输出泄漏的具体信息。我们可以根据这些信息解决内存泄漏问题。