2012-04-27 66 views
0

Possible Duplicate:
OutOfMemoryError: bitmap size exceeds VM budget :- AndroidAndroid的虚拟机内存不足错误

我上下研究这个问题,我无法找到我的特定问题什么。我使用位于我的可绘制文件夹中的.PNG文件作为按钮背景。按钮很大(约150p x 150 p),并使用图像和渐变看起来不错。按下单个.xml文件中定义的按钮后,背景会发生变化。我在谷歌找到的解决方案似乎是编程调用的图像,而不是在布局中指定的图像。当我经常退出并进入不同的布局和不同的按钮时,我最终会得到内存不足的错误

04-27 22:18:46.227:E/dalvikvm-heap(512):396900字节的外部分配这个过程太大了。

04-27 22:18:46.427:E/AndroidRuntime(512):java.lang.OutOfMemoryError:所致位图的大小超过VM预算

我的问题是我怎么分配更多的内存时,我的图片是在布局中指定的并且不会添加程序化?

+0

你有大的图像的背景吗? 150px x 150px图像并不那么大。 150 * 150 * 4(假设32位位图,每像素4字节)= 90,000字节,远小于396,900字节。 – kabuko 2012-04-27 22:40:07

+0

我有6个这样的图像每个屏幕和我的背景是一个简单的十六进制颜色,根本没有大的图像。在我的桌面上,如果我右键单击我的.PNG的一个它说它是40 kb的。当我删除这个按钮图像时,我没有任何问题。这张照片太大了吗?下一个最大的大小是20kb – 2012-04-28 01:32:04

+0

你尝试使用bitmap.isrecycled() – codeskraps 2012-04-27 22:58:24

回答

1

下可以搞清楚什么吃你的记忆力有帮助。使用Debug.dumpHprofData()转储堆。在此之后,您将文件转换为hprof-conv并使用Eclipse Memory Analyzer检查生成的文件。

注意UncaughtExceptionHandler中的包装异常,有时OOM异常包装在RuntimeException中。

0

它是否立即崩溃或过一段时间?一些图片不应该让你的应用崩溃,即使是很大的应用。过去我发现很多旋转会泄漏内存,直到应用程序崩溃;事实上,这就是我看到OOM问题最多的地方。如果你遇到同样的问题,那是因为你保留了一个指向上下文,目录的指针,或者保持一个指向View的指针。

添加UncaughtExceptionHandler和转储堆,当你的OOM异常:

1

如果您在应用程序中导航时创建了多个创建相同活动的实例,则可能会导致您的问题。使用SINGLE_TOP或SINGLE_TASK标志来解决这个问题。请注意,Android似乎存在一个BUG,以至于SINGLE_TOP的功能。您将需要声明您的活动为SINLGE_TOP 使用SINLGE_TOP标志启动活动。下面是文档:http://developer.android.com/guide/topics/manifest/activity-element.html#lmode