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 - 多少图像?

加载图像时出错 - “位图大小超出 VM 预算”

Pyspark - DataFrame persist() 出错 java.lang.OutOfMemoryError:超出 GC 开销限制

引起:java.lang.OutOfMemoryError:超出GC开销限制