在Android实际开发中,程序员们经常会遇到内存泄露(Out Of Memory),说白了,就是内存不够用了。导致应用程序运行很卡,甚至直接闪退。为什么会出现内存溢出呢?因为在Android手机中,每个应用一般默认只能使用16M内存(当然这个16M不是固定的,一般是由手机商家设定),如果超过这个限制就是出现很快或者闪退。
在Android中几种常的OOM包括以下几种:
一、static修饰词引起的内存泄露
static是Java中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费过多的实例(Context的情况最多),这时就要谨慎对待了。
public class ClassName {
private static Context mContext;
}
以上的代码是很危险的,如果将Activity赋值到么mContext的话。那么即使该Activity已经onDestroy,但是由于仍有对象保存它的引用,因此该Activity依然不会被释放.
如何才能有效的避免这种引用的发生呢?
第一,应该尽量避免static成员变量引用资源耗费过多的实例,比如Context。
第二、Context尽量使用Application Context,因为Application的Context的生命周期比较长,引用它不会出现内存泄露的问题。
第三、使用WeakReference代替强引用。比如可以使用WeakReference<Context> mContextRef;
这里说的弱引用(WeakReference)、软引用(softReference)以及强引用?我们先来简单比较下:
强引用:String str="helloworld";就是我们经常用的,当内存不足时,不会回收这个对象。
弱引用 :ObjectA a = newObjectA();
ObjectB b = new ObjectB(a);
a = null;
在上面我们先初始化了一个ObjectA对象,再初始化了一ObjectB,需要注意的是,在初始化ObjectB,需要传递一个ObjectA对象,注意这样ObjectB就对ObjectA有一个引用。当ObjectA对象的引用a置空了,a不再指向对象ObjectA的地址(a = null) 时,我们都知道当一个对象不再被其他对象引用的时候,是会被GC回收的。在这样很显然是ObjectA是不对被回收的,因为