您的位置:首页 > 编程语言 > Java开发

java.lang.OutOfMemoryError:bitmap size exceeds VM budget 如何解决

2012-03-02 10:51 477 查看
Android系统会对bitmap内存空间有限制,一般上限为8M,因此在我们进行图片处理操作时,经常会遇到超过上限抛出异常:

java.lang.OutOfMemoryError:bitmap size exceeds VM budget

这是 Bitmap bm = BitmapFactory.decodeFile(path)引起的,Path是sd卡中图片的路径,如果图片过大就会产生错误;

常用的解决方案有:

一、我们可以通过修改采样避免这个问题:

BitmapFactory.Options options=new BitmapFactory.Options();

options.inSampleSize = 10;

Bitmap bmp=BitmapFactory.decodeFile(path,options);

修改采样可以避免这个问题,但是这个inSampleSize该如何确定?1000*1000的图片缩小10倍,可以避免内存溢出;但是本身很小的图片也缩小10倍,并不是我想要的结果。。。。。怎么做可以兼顾?

二、异常捕获,避免程序崩溃

try{

Bitmap bmp=BitmapFactory.decodeFile(path,options);

}catch (OutOfMemoryError e) {

// 提示系统,进行内存回收

System.gc();

//清除程序缓存

clearCache();

//压缩图片重新加载

reload();

}

介绍一下图片占用进程的内存算法吧。

android中处理图片的基础类是Bitmap,顾名思义,就是位图。占用内存的算法如下:

图片的width*height*Config。

如果Config设置为ARGB_8888,那么上面的Config就是4。一张480*320的图片占用的内存就是480*320*4 byte。

前面有人说了一下8M的概念,其实是在默认情况下android进程的内存占用量为16M,因为Bitmap他除了java中持有数据外,底层C++的 skia图形库还会持有一个SKBitmap对象,因此一般图片占用内存推荐大小应该不超过8M。这个可以调整,编译源代码时可以设置参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐