Android使用bitmap导致内存溢出(oom)问题

最近在一家创业公司实习的时候,参与了两个Android项目,由于项目中有几处涉及到图像处理,在一些手机上就容易出现内存溢出(OOM)问题(特别是三星……)。经过长时间的寻找发现是bitmap的初始化堆为16M,而当前已分配内存加上需要的内存如果超过当前堆的最大内存就会OOM,也就是不能超过8M。

这个问题请参考(好像也是转的):http://blog.csdn.net/eustoma/article/details/6696844 

由于在许多高配机型上不会出现OOM问题,于是尝试从扩大堆的方向入手,各种google各种百度发现了手动修改堆大小的方法。

private final static
int CWJ_HEAP_SIZE = 6* 1024* 1024 ;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。
        发现没用,查了资料后才知道在Android 2.3之后就不能手动修改堆大小了。

之后又参考了google给的解决方案:https://developer.android.com/training/displaying-bitmaps/index.html      没能解决问题。

最后终于领悟了,从节约着用bitmap内存的角度出发,通过规避BitmapFactory.decodeStream或者decodeFile函数,使用BitmapFactory.decodeFileDescriptor,原理我同样知其然不知其所以然,参考http://www.cnblogs.com/akira90/archive/2013/03/15/2960666.html

在Eclipse中观察内存使用量有所减少,但是还是不够。最后又通过将已用完的bitmap手动释放

bitmap.recycle(); 
bitmap = null; 
System.gc();
recycle貌似不一定会及时释放,于是加个赋值为null就能够保证gc的时候回收掉。要注意的是释放的只能是不用的bitmap,如果释放后再去调用这个bitmap的话就会暴空指针错误了。

实习生第一次写博客,欢迎提出宝贵意见。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值