如何避免OOM异常

来源:互联网 发布:windows boot manager 编辑:程序博客网 时间:2024/05/17 03:04
如何避免OOM异常
OOM 内存溢出,想要避免 OOM 异常首先我们要知道什么情况下会导致OOM异常。
1、图片过大导致OOM
Android 中 用 bitmap 时 很 容 易 内 存 溢 出 , 比 如 报 如 下 错 误 :
Java.lang.OutOfMemoryError : bitmap size exceeds VM budget。
解决方法:

方法1: 等比例缩小图片

以上代码可以优化内存溢出,但它只是改变图片大小,并不能彻底解决内存溢出。

方法2:对图片采用软引用,及时地进行recyle()操作

方法3:使用加载图片框架处理图片,如专业处理加载图片的ImageLoader图片加载框架。
还有我们学的XUtils的BitMapUtils来做处理。

2、界面切换导致OOM
一般情况下,开发中都会禁止横屏的。因为如果是来回切换话,activity的生命周期会重新销毁然后创建。
有时候我们会发现这样的问题,横竖屏切换N次后 OOM了。
这种问题没有固定的解决方法,但是我们可以从以下几个方面下手分析。

1、看看页面布局当中有没有大的图片,比如背景图之类的。
去除xml中相关设置,改在程序中设置背景图(放在onCreate()方法中):

在 Activity destory 时注意,drawable.setCallback(null); 防止Activity 得不到及时的释放。

2、跟上面方法相似,直接把xml配置文件加载成view 再放到一个容器里,然后直接调用 this.setContentView(View view);方法,
避免xml的重复加载。

3、 在页面切换时尽可能少地重复使用一些代码 ,
比如:重复调用数据库,反复使用某些对象等等......

3、查询数据库没有关闭游标

程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会出现内存问题,这样就会给以后的测试和问题排查带来困难和风险。

4、构造Adapter时,没有使用缓存的 convertView
在使用ListView的时候通常会使用 Adapter,那么我们应该尽可能的使用ConvertView。为什么要使用convertView?
当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。

5、Bitmap对象不再使用时调用recycle()释放内存
有时我们会手工的操作Bitmap对象,如果一个Bitmap对象比较占内存,当它不再被使用的时候,可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是必须的,视情况而定。

6、其他
Android应用程序中最典型的需要注意释放资源的情况是在Activity的生命周期中,在 onPause()、onStop()、 onDestroy()方法中需要适当的释放资源的情况。使用广播没有注销也会产生OOM。

0 0
原创粉丝点击