想要避免OOM 异常首先咱们要知道什么状况下会致使OOM 异常。数据库
一、图片过大致使OOM缓存
Android 中用bitmap 时很容易内存溢出,好比报以下错误:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget。
解决方法:
方法1: 等比例缩小图片
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
//Options 只保存图片尺寸大小,不保存图片到内存
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 2;
Bitmap bmp = null;
bmp = BitmapFactory.decodeResource(getResources(),
mImageIds[position],opts);
//回收
bmp.recycle();
以上代码能够优化内存溢出,但它只是改变图片大小,并不能完全解决内存溢出。测试
方法2:对图片采用软引用,及时地进行recyle()操做
SoftReference<Bitmap> bitmap = new SoftReference<Bitmap>(pBitmap);
if(bitmap != null){
if(bitmap.get() != null && !bitmap.get().isRecycled()){
bitmap.get().recycle();
bitmap = null;
}
}优化
二、Bitmap 对象再也不使用时调用recycle()释放内存spa
有时咱们会手工的操做Bitmap 对象,若是一个Bitmap 对象比较占内存,当它再也不被使用的时候,code
能够调用Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是必须的,视状况而定。视频
三、资源对象没有关闭对象
资源性对象好比(Cursor,IO流等)每每都用了一些缓冲,咱们在不使用的时候,应该及时关闭它们, 以便它们的缓冲及时回收内存。生命周期
查询数据库没有关闭游标:程序中常常会进行查询数据库的操做,可是常常会有使用完毕Cursor 后没有关闭的状况。若是咱们的查询结果集比较小,对内存的消耗不容易被发现,只有在长时间大量操做的状况下才会出现内存问题,这样就会给之后的测试和问题排查带来困难和风险。图片
四、硬件资源的释放
Android中最典型的须要注意释放硬件资源的状况是在Activity 的生命周期中,在onPause()、onStop()、onDestroy()方法中
须要适当的释放资源的状况,这些硬件资源可能包括:视频、音频、相机等。
五、构造Adapter 时,没有使用缓存的convertView
在使用ListView 的时候一般会使用Adapter,那么咱们应该尽量的使用ConvertView。
六、避免内存泄漏致使OOM
内存泄漏会致使对象没法回收,从而占用系统内存,可能致使OOM,因此咱们要尽可能避免内存泄漏。