Android内存分配

Android内存分配,android,memory-management,Android,Memory Management,我收到“位图大小超过VM预算”错误。我读到有16MB的内存限制。Romain Guy说“你只能分配16MB的内存 整个应用程序的内存不足” 但是,我的应用程序必须在达到该限制之前很久内存就用完了。所以我的问题是:如何为我的应用程序分配内存。。。我如何增加应用程序的分配(在16MB最大值内) 与任何Java VM一样,堆内存将自动增长到最大大小。但是,位图是在虚拟机之外分配的,因此您不容易在统计信息中“看到”它们。最好的办法是确保不要使用大型位图,或者使用 当您在安卓1.6或更高版本上时,可以从

我收到“位图大小超过VM预算”错误。我读到有16MB的内存限制。Romain Guy说“你只能分配16MB的内存 整个应用程序的内存不足”


但是,我的应用程序必须在达到该限制之前很久内存就用完了。所以我的问题是:如何为我的应用程序分配内存。。。我如何增加应用程序的分配(在16MB最大值内)

与任何Java VM一样,堆内存将自动增长到最大大小。但是,位图是在虚拟机之外分配的,因此您不容易在统计信息中“看到”它们。最好的办法是确保不要使用大型位图,或者使用

当您在安卓1.6或更高版本上时,可以从Eclipse生成堆转储,并且可以使用EclipseMat分析转储

通常,您无法控制实际设备上的最大堆大小,除非您使用自定义硬件或固件

developer.android.com上应该有一篇关于在1.6上转储堆的文章,但我找不到它:(

编辑
另外,我必须提到,您可以通过使用

android:largeHeap=“true”


在清单中。但由于大多数应用程序不需要这一点,这一点非常不受欢迎。

请注意,堆限制取决于设备。在Droid或Nexus One上,该限制为24 MB(以容纳更大的图形资源)

如果您使用的是线程,则调试器可能是问题的根源。如果您在调试器下运行应用程序,则创建的任何线程都将被调试器保留,即使它们已完成运行。这会导致在没有调试器的情况下运行应用程序时不会出现内存错误


我最近找到了你问题的答案

转到Android SDK目录并单击
运行sdk管理器(工具->android运行此文件)

在SDK管理器中,转到工具-->管理AVD

现在Android虚拟设备管理器对话框已打开

在该窗口中选择AVD并单击编辑

现在在SD卡部分选择大小并设置1024 MiB 在硬件部分,单击新建并选择属性“最大VM应用程序堆大小” 现在设置100(根据您的应用程序要求) 最后单击“编辑AVD”

编辑后,单击sdk管理器上的刷新按钮


现在在AVD中运行你的应用程序,你的问题就解决了。

谢谢。我有时间的时候会看看堆转储和MAT。我刚刚注意到你说我可以在Android 1.6上获得堆转储并使用Eclipse MAT。不幸的是,我的设备在1.5上,所以这就是我编程的目的。有没有简单的方法可以获得1.5的内存分析DDMS include中SysInfo中的内存使用情况图表显示每次屏幕旋转时的使用情况略有增加;它是否包括位图使用的非堆内存?DDMS分配跟踪器不显示任何显著的内存使用情况(假设其单位为字节);除了位图之外,是否有其他对象不会显示在DDMS分配跟踪器中?您可以在1.6 emulator中运行代码进行调试,也可以尝试此处所述的过程,或者使用api将堆从应用程序转储到您喜欢的位置。安卓1.5也可以工作,请选中安卓:largeHeap=”“是的“对应用程序标记不起作用。它是以GB为单位删除的吗?你知道有什么替代方案吗?Nexus S也有24MB,似乎大多数高端设备的容量都会超过16MB,但如果你想在任何设备上运行,你应该将其限制在16MB以下。不,Nexus S在2.3上有32MB。我如何知道我设备的堆限制?Runtime.getRuntime().maxMemory();我的Nexus S在ICS下有48 MB。谢谢你。我曾想知道使用调试器是否会导致可能不会发生的内存问题。很高兴得到确认。640KB应该足以满足谷歌慷慨大方的要求……而且几乎没有什么(几乎什么都没有)为了处理应用程序可用的内存并减少内存,位图正在使用。。