高堆大小但分配大小较低时会发生内存不足错误。为什么?

时间:2011-04-23 01:36:46

标签: android memory heap

我有一个相当内存密集的进程,可能导致堆大小增长接近其限制(在本例中为24)。

但是,当该过程结束时,分配的内存(在DDMS堆工具和堆转储中列出)远远低于6或7。

尽管分配的内存很少,并且有大量的可用内存,但堆似乎没有回来。

所以尽管它说有足够的可用内存,但在这种情况下我仍然会出现内存错误。

所以它引出了几个问题:

  1. 即使DDMS的Heap选项卡中的Allocated内存和堆转储本身只显示分配的7mb内存,还有未提及的未被垃圾收集的隐藏内存?如果是这样,我该如何追踪?

  2. 似乎内存不足错误是基于堆大小,而不是分配内存大小。那么当内存密集型进程结束时,如果不需要那么高的话,是否有办法强制堆大小恢复?

  3. 感谢您的见解。

3 个答案:

答案 0 :(得分:13)

当您尝试使用的内存超过允许的最大堆大小时,会发生内存不足。但请注意,Android的GC目前不会对堆进行碎片整理,这似乎是您遇到的问题。您的堆可能有大量可用内存,但在小块中碎片化。如果VM无法找到足够大的分配块,那么你会尝试这样做,OOME就会发生。

答案 1 :(得分:1)

你试过弹出System.gc()吗?

如果您正在使用位图,可能需要查看以下内容:http://davidjhinson.wordpress.com/2010/05/19/scarce-commodities-google-android-memory-and-bitmaps/

答案 2 :(得分:-2)

对于Android 3.2(API 13)及更高版本,如果您的布局中需要“match_parent”的大位图,则可能有助于将 android:configChanges =“orientation | screenSize”添加到您的清单中port和layout-land xml文件。