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

Android 堆大小较大但分配的大小较低时会发生内存不足错误。为什么?,android,memory,heap,Android,Memory,Heap,我有一个相当内存密集的进程,它会导致堆大小在其极限附近增长(本例中为24) 但是,当该进程结束时,分配的内存(如DDMS堆工具和堆转储中列出的)远低于6或7 尽管分配的内存很低,并且有很多空闲内存,堆似乎没有下降 因此,即使它说有足够的内存可用,在这种情况下,我仍然可以得到内存不足的错误 因此,它回避了几个问题: 即使DDMS的Heap选项卡中分配的内存和Heap dumps本身仅显示7mb的已分配内存,但是否存在未提及的未被垃圾收集的隐藏内存?如果是这样,我该如何追踪 内存不足错误似乎是基于堆

我有一个相当内存密集的进程,它会导致堆大小在其极限附近增长(本例中为24)

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

尽管分配的内存很低,并且有很多空闲内存,堆似乎没有下降

因此,即使它说有足够的内存可用,在这种情况下,我仍然可以得到内存不足的错误

因此,它回避了几个问题:

  • 即使DDMS的Heap选项卡中分配的内存和Heap dumps本身仅显示7mb的已分配内存,但是否存在未提及的未被垃圾收集的隐藏内存?如果是这样,我该如何追踪

  • 内存不足错误似乎是基于堆大小,而不是分配的内存大小。那么,当内存密集型进程结束时,堆大小不需要这么高时,有没有办法强制堆大小降下来


  • 感谢您的见解。

    您尝试过在System.gc()中弹出吗


    如果您正在使用位图,您可能需要查看以下内容:

    当您试图使用超过最大允许堆大小的内存时,会出现内存不足。但是请注意,Android的GC目前没有对堆进行碎片整理,这似乎是您遇到的问题。您的堆可能有很多可用内存,但会被分割成小块。如果虚拟机找不到足够大的块来进行您试图进行的分配,则会发生OOME。

    对于Android 3.2(API 13)及更高版本,如果您有需要“匹配父项”的大型位图,则可以将安卓:configChanges=“orientation | screenSize”添加到清单中从layout port和layout land xml文件。

    System.gc()除了正常的自动垃圾收集之外,还能做什么?谢谢你的链接,我来看看。在这种情况下,我对位图做的很少,所以我认为这是另外一回事。实际上不会强制“自动”收集发生。。。只要“告诉”系统现在是“查看”的好时机,并且在可能的情况下调用GC。谢谢你,罗曼。有没有办法避免这种情况,或者让内存更可用?任何方向正确的线索我都可以研究剩下的。。。希望如此;)再次感谢。再想一想,你的评论已经给了我很多要研究的东西。ThankslittleFluffyKitty由于堆大小增加,您是如何解决这个内存不足的问题的。我也遇到了同样的问题,但无法解决。您能帮我吗?@nikki和Ersin,除了使用更少的内存,并在可能和有益的情况下重用和回收对象之外,我还没有找到一个“修复”方法。另一个主要问题是,如果您使用位图,在旧版本的Android(在蜂巢之前)上,它们的内存存储在本机堆中,并且有一些特殊的考虑。关于StackOverflow,这里有很多关于“位图内存”和“位图循环”的好答案,可能也会有帮助。@Littleflufykitty谢谢你的回答。但是现在我已经解决了我的问题。