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的话就会暴空指针错误了。

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

你可能感兴趣的:(Android)