博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存溢出OOM
阅读量:4612 次
发布时间:2019-06-09

本文共 1395 字,大约阅读时间需要 4 分钟。

如何避免OOM 异常?

想要避免OOM 异常首先我们要知道什么情况下会导致OOM 异常。

1、图片过大导致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;
}
}

2、Bitmap 对象不再使用时调用recycle()释放内存

有时我们会手工的操作Bitmap 对象,如果一个Bitmap 对象比较占内存,当它不再被使用的时候,

可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是必须的,视情况而定。

 

3、资源对象没有关闭

资源性对象比如(Cursor,IO流等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们, 以便它们的缓冲及时回收内存。

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

 

4、硬件资源的释放

Android中最典型的需要注意释放硬件资源的情况是在Activity 的生命周期中,在onPause()、onStop()、onDestroy()方法中

需要适当的释放资源的情况,这些硬件资源可能包括:视频、音频、相机等。

 

5、构造Adapter 时,没有使用缓存的convertView

在使用ListView 的时候通常会使用Adapter,那么我们应该尽可能的使用ConvertView。

6、避免内存泄漏导致OOM

内存泄漏会导致对象无法回收,从而占用系统内存,可能导致OOM,所以我们要尽量避免内存泄漏。 

转载于:https://www.cnblogs.com/wytiger/p/5367613.html

你可能感兴趣的文章
自旋锁和互斥锁的区别
查看>>
react混合开发APP,资源分享
查看>>
入门篇
查看>>
【洛谷1829】 [国家集训队] Crash的数字表格(重拾莫比乌斯反演)
查看>>
[转]免费api大全
查看>>
git 认证问题之一的解决 : http ssh 互换
查看>>
sql where 1=1作用
查看>>
搜索算法----二分查找
查看>>
Python语言编程
查看>>
[poj 1469]Courses
查看>>
Xcode8出现AQDefaultDevice(173):Skipping input stram 0 0 0x0
查看>>
数据结构(二十四)二叉树的链式存储结构(二叉链表)
查看>>
Material Design Lite,简洁惊艳的前端工具箱 之 布局组件。
查看>>
关于bootstrap Modal弹窗 滚动条的问题
查看>>
Django----------路由控制
查看>>
将数字转化为字符串的快捷方式
查看>>
java23种设计模式
查看>>
冲刺周期一--站立会议04
查看>>
支持IE6以上阴影效果纯CSS
查看>>
优化算法与特征缩放
查看>>