Android 内存泄露:OOM全面分析、内存分析

本文详细探讨了Android开发中常见的内存泄露原因,包括static修饰的引用、线程Thread和AsyncTask、Bitmap处理不当、Handler使用误区、Cursor管理、Adapter构造及Universal-Image-Loader的使用注意事项。通过分析内存分析工具DDMS的使用方法,帮助开发者诊断和解决内存溢出问题。
摘要由CSDN通过智能技术生成
         在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是不对被回收的,因为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值