android 内存溢出(oom)产生原因和内存优化

来源:互联网 发布:淘宝2016版本5.7.0下载 编辑:程序博客网 时间:2024/06/05 04:16

android内存溢出的原因:

android使用基于寄存器的Dalvik虚拟机,每个android应用单独使用一个Dalvik虚拟机,每个虚拟机使用的堆内存是有限的,超过了限制就会引发oom错误。产生oom的原因大约是:1、长期保存某些大型资源的应用,资源得不到释放(比如Contextg);2、使用了多个Bitmap


容易造成oom的情况:

1、不恰当的使用static关键字。静态变量时属于类而不是对象,所以使用static保存大资源(比如Context)非常容易造成oom。

解决方案:

尽量不要使用static 变量保存大资源(比如Context等)

使用软应用

使用application Context

2、内部类线程引发oom。 线程的生命周期不可控,在线程没有完成run方法之前线程不会被销毁,同事由于采用内部类产生的线程同时用保存Activity的引用。同理使用Activity的内部类Asyncatask也容易造成oom

解决方案:

将内部类线程改为静态内部类

在线程内部使用弱引用保存Context引用,解决模型如下:(转)

  1. public abstract class WeakAsyncTask<Params, Progress, Result, WeakTarget> extends  
  2.         AsyncTask<Params, Progress, Result> {  
  3.     protected WeakReference<WeakTarget> mTarget;  
  4.   
  5.     public WeakAsyncTask(WeakTarget target) {  
  6.         mTarget = new WeakReference<WeakTarget>(target);  
  7.     }  
  8.   
  9.     /** {@inheritDoc} */  
  10.     @Override  
  11.     protected final void onPreExecute() {  
  12.         final WeakTarget target = mTarget.get();  
  13.         if (target != null) {  
  14.             this.onPreExecute(target);  
  15.         }  
  16.     }  
  17.   
  18.     /** {@inheritDoc} */  
  19.     @Override  
  20.     protected final Result doInBackground(Params... params) {  
  21.         final WeakTarget target = mTarget.get();  
  22.         if (target != null) {  
  23.             return this.doInBackground(target, params);  
  24.         } else {  
  25.             return null;  
  26.         }  
  27.     }  
  28.   
  29.     /** {@inheritDoc} */  
  30.     @Override  
  31.     protected final void onPostExecute(Result result) {  
  32.         final WeakTarget target = mTarget.get();  
  33.         if (target != null) {  
  34.             this.onPostExecute(target, result);  
  35.         }  
  36.     }  
  37.   
  38.     protected void onPreExecute(WeakTarget target) {  
  39.         // No default action  
  40.     }  
  41.   
  42.     protected abstract Result doInBackground(WeakTarget target, Params... params);  
  43.   
  44.     protected void onPostExecute(WeakTarget target, Result result) {  
  45.         // No default action  
  46.     }  
  47. }  
3、Bitmap使用,使用数量多的Bitmap极易造成oom错误
解决方案:
及时销毁Bitmap,bitmap不在使用的时候及时Recycle
设定采样率,使用BitmapFactory处理Bitmap再使用
使用软应用,如果使用一个Bitmap却没有保留他的引用那么则没有办法调用recycle方法,使用软应用可以使bitmap在内存不足的时候得到释放

4、游标cursor的使用
使用游标cursor完毕应该及时关闭cursor
使用cursorAdapter的情况下应该在Activity的ondestory中调用cursor的close方法

5、其他情况
使用9path代替大图
adapter中使用convertView

0 0
原创粉丝点击