我收到'java.lang.OutOfMemoryError:位图大小超过VM预算'错误...我正在做的是我从服务器下载~50张图像并将它们存储在内存中。
当我第一次看到这个问题时,我优化了我们的图像以仅下载缩略图(50个JPEG,每个~12kB,大小为160x240px)并且我在不需要它时立即通过调用Bitmap.recycle()开始释放它们。一切都在使用更新的手机,这个过程可以达到32MB,但是在没有最大16MB的旧手机上。
所以我的问题是:
在旧手机(即 Runtime.getRuntime(。。maxMemory()调用返回的内存)上所有进程限制为32MB或更少是否正确?此内存适用于Dalvik,框架,应用程序和数据?
我们可以在应用程序中使用更多内存,然后由 Runtime.getRuntime()返回的数量.maxMemory()?
我应该如何优化图像 - 它们现在还很小......我应该开始将它们交换到内置闪存/ SD吗?只要它们显示在 GridView ...
我感谢任何帮助 - 我在这里经历了类似的线索并完成了我在那里看到的......但仍然不够......
修改更新
我在weakwire
回答后添加了这些评论。
•在我的情况下,我下载~50张图片并将所有这些图像存储在内存中的Bitmap对象中。看下面为什么我这样做。
•位图对象中的图像占用了多少内存?原始格式是否意味着如果图像为160x240x24bpp
,它在内存中占用~115 kB
,那么50 images are ~6MB
? 这是正确的吗?
•我还读过图像不是我的进程堆的一部分,但它们被计算在内,因此使用 maxMemory(),totalMemory(),freeMemory()无法提供帮助。 这是正确的吗?
•我的应用程序UI具有完整的自定义图形(60个png文件,其中许多是draw9pacth格式)
•我在24/32 MB设备上没有问题,我只在16 MB设备上有问题
•只要下载所有50张图像并将其存储到内存中,我就会以2列宽 GridView 显示它们。我认为为此我需要将所有图像保存在堆上(保存到内部闪存我认为不是那里的解决方案)。 这是正确的假设吗?
•当我初始化应用程序并加载UI时,我可以看到我有448kB可用内存5459kB分配了整个16384kB预算。我假设我不能真正使用整个16384kB +如果我理解正确我无法从maxMemory(),totalMemory(),freeMemory()中看到已经加载的图像占用多少,因为dalvik-vm没有“看到”这堆。假设已经使用了~2M并且我可以使用高达~14MB,我还剩5.5MB,所以我很容易在内存中有50个图像遇到OOM问题... 这是正确的计算吗?
我肯定会查看建议的视频 - 它看起来不错 - 但是weakwire
,请尝试回答我的问题......感谢您的支持和时间!
答案 0 :(得分:2)
android:largeHeap =“true”是不可能的。如果没有正确完成,您将有一个非崩溃但SLOW应用程序。
32MB VM很大。许多现代手机仍然使用12MB或16MB。更大!=更好。
放置图像的位置无关紧要。唯一的想法是,如果他们在虚拟机中。
NO Runtime.getRuntime()。maxMemory()是你可以使用的最大内存。
位图是一个强大的对象(就像它的像素引用而不是Bitmap对象本身而言)。如果没有正确解除分配,GC无法收集它们并且你得到OutOfMemoryError。
现在适合你的情况。 5MB的图像不应该导致OOME。您有内存泄漏或其他大型阻塞对象(可能是大型背景图像)。您应该检查MAT和this video。有一些方法可以告诉垃圾收集器收集位图,但我认为你的问题可以很容易地避免。 5MB的图像很好,可以管理。(你不需要一次显示全部50个?是吗?)
编辑后的注释
我还读过,图像不是我的进程堆的一部分,但是它们被计算在内,因此使用maxMemory(),totalMemory(),freeMemory()实际上无法提供帮助。这是对的吗?
No.Images是堆的一部分,但未在MAT和其他工具中显示。我认为它们仅在3.2上可见,但是位图就在那里。
当我下载所有50张图像并将它们存储到内存中时,我会在2列宽度GridView中显示它们。我认为为此我需要将所有图像保存在堆上(保存到内部闪存我认为不是那里的解决方案)。这是正确的假设吗?
这种假设不正确,这种假设是造成问题的原因。
为什么你需要他们全部到堆?您可以在存储设备(SD或内部存储器缓存)中使用带有iamges的lagfree UI。如果您不确定如何在没有lazyLoading的情况下处理它们,则必须使用LazyLoad。您应该检查一些流行图像的代码(向下) )加载器,看看它们如何处理引用以及它们的缓存系统是如何组织的。你也可以使用其中一个