在谈内存泄露之前,我们先谈一谈android的垃圾回收机制。
垃圾,即没有利用价值的东西。程序在运行时,需要对象来执行,这些对象都会占用内存空间。那么,当这些对象没有了利用价值,变成了垃圾,我们该如何对其进行回收?
这里,可以参看我的另一篇文章 JVM虚拟机以及垃圾回收机制学习总结
Android中使用的是Dalvik虚拟机,其使用的垃圾回收算法是Mark&Sweep,标记-清理算法。
如果这些垃圾不能被及时回收,就会造成内存泄露。
其实在Android中会造成内存泄露的情景无外乎两种:
- 全局进程(process-global)的static变量。这个无视应用的状态,持有Activity的强引用的怪物。
- 活在Activity生命周期之外的线程。没有清空对Activity的强引用。
检查一下你的项目中是否有以下几种情况:
- Static Activities
- Static Views
- Inner Classes
- Anonymous Classes
- Handler
- Threads
- TimerTask
- Sensor Manager
[Android]Context泄露之谜:Handle & 内部类
下面推荐一款Android中检测内存泄露的工具:square公司推出的一款简单粗暴的检测内存泄漏的工具-- LeakCanary
下面的用法展示转自 http://www.open-open.com/lib/view/open1450669901261.html
上图就是LeakCanary的图标。当程序在debug的时候便会看见它了,但是当然release的时候就看不见了。
LeakCanary作为一个简单粗暴的工具,用法也相当简单
在build.gradle中引入LeakCanary
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
一个是debug包,一个是release包的,从引入包的结构也能看出端倪
由于LeakCanary是测试整个app的内存泄露情况,所以你需要在你的application中启动它
package com.zimo.guo;
import android.app.Application;
import com.squareup.leakcanary.LeakCanary;
/**
* Created by zimo on 15/8/7.
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
ok,现在就可以测试程序中的内存泄露情况,直观明了
这么有逼格的工具,赶紧来试试吧,要想使你的app的内存泄露灰飞烟灭,try it