OutOfMemoryError:位图大小超出 VM 预算:- Android [重复]
Posted
技术标签:
【中文标题】OutOfMemoryError:位图大小超出 VM 预算:- Android [重复]【英文标题】:OutOfMemoryError: bitmap size exceeds VM budget :- Android [duplicate] 【发布时间】:2011-02-25 01:26:58 【问题描述】:可能重复:android: Strange out of memory issue while loading an image to a Bitmap object
我正在从 Url 下载图像并显示它们。在下载时它给
out of memory error : bitmap size exceeds VM budget
。
我正在使用可绘制的。代码如下:
HttpClient httpclient= new DefaultHttpClient();
HttpResponse response=(HttpResponse)httpclient.execute(httpRequest);
HttpEntity entity= response.getEntity();
BufferedHttpEntity bufHttpEntity=new BufferedHttpEntity(entity);
InputStream instream = bufHttpEntity.getContent();
Bitmap bm = BitmapFactory.decodeStream(instream);
Bitmap useThisBitmap =
Bitmap.createScaledBitmap(bm,bm.getWidth(),bm.getHeight(), true);
bm.recycle();
BitmapDrawable bt= new BitmapDrawable(useThisBitmap);
System.gc();
这里是错误:
`05-28 14:55:47.251: ERROR/AndroidRuntime(4188):
java.lang.OutOfMemoryError: bitmap size exceeds VM budget`
【问题讨论】:
如果图像真的很大,这个解决方案应该可以帮助***.com/questions/477572/… 嗨,马塞洛·坎托斯!!! ..图像的高度和宽度= 320x320 找出您可以通过多少种方式获取图像,这样您就不会发现内存问题 感谢 OM The Eternity,,, 我试过了...但主要问题是 VM... 我知道我来晚了,但是如果生成图像并且在创建它时 (img = Bitmap.createBitmap(size.x, size.y, Bitmap.Config.ARGB_8888);
) 会崩溃怎么办?
【参考方案1】:
将decodeStream(is, outPadding, opts)
用于
BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false; //Disable Dithering mode
opts.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared
opts.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
opts.inTempStorage=new byte[32 * 1024];
【讨论】:
谢谢,我的应用程序现在可以运行了! 谢谢,几个月来一直在寻找解决方案【参考方案2】:您可以检查图像大小,然后按适当的因子对其进行下采样。
看到这个问题:Handling large Bitmaps
【讨论】:
【参考方案3】:这个问题似乎已经被多次报告过,例如here 和here... 对不起Shalini,但如果是同样的问题,似乎根本没有解决方案......
Romain Guy 的唯一建议是to use less memory...
所以,祝你好运,以不同的方式思考你的东西......
【讨论】:
有一个解决方案:使用的内存少于允许的最大值。我知道这是一个令人沮丧的答案,但手机不像台式机那样具有“无限”数量的 RAM。你必须小心。 不知道你要加入堆栈;)正如我所说,你的建议是使用更少的内存......你会建议这样做吗?缩小图片大小? @RomainGuy现在是 2020 年,我的手机有 4GB 内存【参考方案4】:最后,按照上述建议重新采样图像后,您可以致电bitmap_file.recycle()。
【讨论】:
【参考方案5】:事实上,某些 Android 版本存在 BUG,尤其是 2.1 版本总是出现类似问题。
我发布了一个应用程序,我在其中非常注意资源使用。我什至删除了很多我正在使用的位图,现在它们是使用图形基元动态创建的。当不使用位图时,我也会回收它们。当然,我已经检查过我的应用程序中没有内存泄漏:使用的内存不会不受控制地增长,它始终保持在合理的值内。
尽管我已投入大量精力来试图避免此问题,但我仍然会从 2.1 和 2.1-update1 设备中收到许多烦人的异常。我现在正在使用批评来报告崩溃,我已经看到即使应用程序仅使用 4 兆字节的 RAM,它也会发生,比每个 Android 设备必须为应用程序拥有的 16M 堆大小小四倍——事实上是现在大多数设备的堆大小都大于 16M-。
我所有的位图的大小都是 800x480 像素,在最坏的情况下,因为 ARGB_8888 每个可能不会占用超过 1.5MB,但是当它只占用 4 MB 时尝试加载一个会崩溃,所以至少应该有另有 12 MB 可用空间。而且我的大多数位图都加载为占用一半内存的 ARGB_4444,我只在位图看起来非常糟糕的 4444 时才使用 ARGB_8888。
所以对我来说,很明显这些 Android 版本上有些东西不能正常工作。 99'9% 的崩溃来自 2.1 和 2.1 更新,其余的可能由其他准时原因解释。
【讨论】:
【参考方案6】:我已经尝试了很多东西,这是有效的。
BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false; //Disable Dithering mode
opts.inPurgeable=true;
opts.inScale=8;
///after you use your images
System.gc();
【讨论】:
请求垃圾回收不会清理内存泄漏。【参考方案7】:这是一个实用的答案,我试图在运行时避免这个问题。它也解决了我的问题。
Runtime.getRuntime().gc();
调用垃圾收集器是个好主意。
【讨论】:
这并没有显式调用垃圾收集器,但它建议虚拟机这样做。 如果你正在泄漏内存,这绝对不会做任何事情。垃圾收集只回收没有其他任何东西挂在对它们的引用上的对象。以上是关于OutOfMemoryError:位图大小超出 VM 预算:- Android [重复]的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.OutOfMemoryError:位图大小超出 VM 预算
java.lang.OutOfMemoryError:位图大小超出 VM 预算 - Android
java.lang.OutOfMemoryError:位图大小超出 VM 预算 - android - 多少图像?
Pyspark - DataFrame persist() 出错 java.lang.OutOfMemoryError:超出 GC 开销限制