Android开发中如何避免 Out Of Memory(OOM) ?

原创 2015年11月20日 17:28:51


   

       在android开发中,Process使用的内存是有限的,一旦超出了限定,程序就会跳异常。那这个问题如何避免呢?小编搜罗了一些比较好的方法,希望可以给大家一个借鉴吧。

 

1、不要Memory Leak

        对于OOM,其实最重要的是注意不要Memory Leak。而Memory Leak是会有多个方面会引起的,比如Drawable, RemoteViews, Receiver, Cursor,InputStream, MediaPlayer等,此外,如果使用JNI也会因为C语言或C++的代码导致Memory Leak。

        除了Memory Leak,大数据量的操作也会导致OOM,比如之前其他回答提到的Bitmap,还有ListAdapter,如果在getView时处理不当,也很容易导致OOM,所以在ListAdapter时应该尽量使用convertView。   

最后,可以用android.os.StrictMode以及Eclipse的MAT工具来进行OOM和Memory Leak的检测。

 

2、时间换空间

       尽量文件化一些占用内存的数据。最典型的就是ListView中的Bitmap,将Bitmap都本地文件缓存,内存中只保留最近使用的4张图片,在使用中发现还是会偶尔出现OOM,然后我就将其改为完全的读取文件,内存中不保留图片,使用以后都自动回收,由此扩展的数据文件也同样缓存成文件。      

        除了Bitmap,其他的地方没想到什么能占用这么大内存,网络下载下来的数据文件需要都留在内存中吗?建议将每次Http请求下来的数据都把url转换成文件名,然后缓存成文件,在下次Http请求的时候先根据url来预读文件,暂时不用的数据就释放掉。      

        经常会OOM可能是在Bitmap处理的时候,比如decodeFile,在往界面上加载图片时,不用直接加载原图,可以进行缩放。一张1000*1000的图片要加载到一个100*100的ImageView上,直接加载进来大多数都会OOM,可以先用inJustDecodeBounds     

BitmapFactory.Optionsoptions = new BitmapFactory.Options();

options.inJustDecodeBounds= true;

拿到这个图片的大小,再算好缩放比例:

int scale = 0;

scale =(int)(options.outHeight / (float)size);

if (scale <=0) {

scale = 1;

}options.inSampleSize= scale;

options.inJustDecodeBounds= false;

再进行decode

总之就是尽量时间换空间,实际这个时间是非常非常短的,用户体验内的。

 

以上就是android开发中,比较常用的两种避免OOM的方法。在编程中,如果大家也遇到了类似问题,不妨可以试试上述方法。

 

相关文章:《android studio中常用设置及其方法详解

Android避免内存溢出(Out of Memory)方法总结

避免内存溢出的方法,主要是对以下三个方面对程序进行优化 内存引用 在处理内存引用之前,我们先来复习下什么是强引用、软引用、弱引用、虚引用 强引用:强引用是使用最普遍的引用。如果一个对象具有强引用,...
  • zhuwentao2150
  • zhuwentao2150
  • 2016年08月02日 20:21
  • 4878

Android中内存泄露与如何有效避免OOM总结

Android系统为每个应用程序分配的内存有限,当一个应用中产生的内存泄漏比较多时,就难免会导致应用所需要的内存超过这个系统分配的内存限额,这就造成了内存溢出而导致应用Crash。内存泄露的危害:只有...
  • gjnm820
  • gjnm820
  • 2016年06月03日 15:09
  • 4196

Android如何避免OOM总结

Android如何避免OOM总结 前面介绍了一些基础的内存管理机制以及OOM的基础知识,那么在实践操作当中,有哪些指导性的规则可以参考呢?归纳下来,可以从四个方面着手,首先是减小对象的内存占用,其次...
  • ljx19900116
  • ljx19900116
  • 2015年11月25日 15:21
  • 7018

Android开发内存优化方式? 避免 Out Of Memory(OOM)

1. 使用更加轻量的数据结构 例如,我们可以考虑使用ArrayMap/SparseArray而不是HashMap等传统数据结构。通常的HashMap的实现方式更加消耗内存,因为它需要一个额外的实例对...
  • u011694328
  • u011694328
  • 2016年11月26日 21:47
  • 205

android开发 - OOM (Out Of Memory)

1.设计上android不存在swap分区   唯一能腾出内存的方式就是释放应用 2.android同时限制了每个应用可以使用的内存大小   1.诸多资源最显著的内存大户就是图片   ...
  • u013538542
  • u013538542
  • 2015年04月01日 21:33
  • 463

android 加载图片轻松避免OOM(out of memory)

在使用android加载图片的时候,经常会出现内存溢出,主要是由于android可使用的内存太小,而通过代码加载进来的图片,并不会被GC回收,于是我写了一个工具类用来加载图片,并且建立缓存,轻松避免内...
  • liaoxingliao
  • liaoxingliao
  • 2011年11月05日 09:08
  • 9077

android camera out of memory安卓照相机OOM问题的解决

  • 2014年09月05日 09:54
  • 1.6MB
  • 下载

android 加载图片轻松避免OOM(out of memory) 支持设置缓存大小,不再强制catch OOM

package l.test1.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFo...
  • liaoxingliao
  • liaoxingliao
  • 2011年12月31日 14:29
  • 4938

Android Bitmap内存限制OOM Out Of Memory

Android Bitmap内存限制OOM Out Of Memory   在编写Android程序的时候,我们总是难免会碰到OOM的错误,那么这个错误究竟是怎么来的呢?我们先来看一下这段异常信息...
  • lideguo1979
  • lideguo1979
  • 2012年05月05日 07:31
  • 848

android图片的压缩处理,防止出现OOM(out of memory)

适用场景: 你显示图片的ImageView的尺寸是100*100,但是你获取的图片资源的尺寸是1024*1024,如果直接把读取的Bitmap加载的话会无端消耗很多内存,因此可以对读取的Bitmap进...
  • yangshouxun0
  • yangshouxun0
  • 2015年01月13日 20:50
  • 308
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android开发中如何避免 Out Of Memory(OOM) ?
举报原因:
原因补充:

(最多只允许输入30个字)