内存不足错误发生在堆大小高但分配大小低的情况下。为啥?

Posted

技术标签:

【中文标题】内存不足错误发生在堆大小高但分配大小低的情况下。为啥?【英文标题】:Out of memory errors occur with a high heap size but low allocated size. Why?内存不足错误发生在堆大小高但分配大小低的情况下。为什么? 【发布时间】:2011-08-11 07:38:18 【问题描述】:

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

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

尽管分配的内存很低,并且有很多可用内存,但堆似乎没有恢复。

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

所以它引出了几个问题:

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

    似乎内存不足错误是基于堆大小,而不是分配的内存大小。那么当内存密集型进程结束时,有没有办法强制堆大小回落呢?

感谢您的见解。

【问题讨论】:

【参考方案1】:

当您尝试使用超过最大允许堆大小的内存时,会发生内存不足。但是请注意,android 的 GC 目前不会对堆进行碎片整理,这似乎是您遇到的问题。您的堆可能有大量可用内存,但碎片化为小块。如果 VM 找不到足够大的块来分配您正在尝试执行的操作,则会发生 OOME。

【讨论】:

谢谢罗曼。有什么办法可以避免这种情况或使这个内存更有用吗?任何正确方向的线索,我可以研究其余的......希望;)再次感谢。 再想一想,您的评论已经让我有很多需要研究的地方。谢谢 littleFluffyKitty 你是如何解决这个问题的 @nikki 和 Ersin,除了使用更少的内存以及在可能和有益的情况下重用和回收对象之外,我还没有找到“修复”。另一个主要部分是如果您正在使用位图,在旧版本的 Android(Honeycomb 之前)上,它们的内存存储在本机堆中,并且有一些特殊考虑。 *** 上有很多与“Bitmap Memory”和“Bitmap Recylcing”相关的很好的答案,它们也可能会有所帮助。 @littleFluffyKitty 感谢您的回答。但现在我解决了我的问题。【参考方案2】:

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

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

【讨论】:

System.gc() 除了正常的自动垃圾回收之外,还有什么作用吗?感谢您的链接,我会看看它。在这种情况下,我很少使用位图,所以我认为这是另外一回事。 实际上并没有强制“自动”收集发生......只是向系统“说”现在是“查看”的好时机以及何时可以调用 GC。 (developer.android.com/reference/java/lang/System.html#gc())【参考方案3】:

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

【讨论】:

以上是关于内存不足错误发生在堆大小高但分配大小低的情况下。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Nuxt 生成致命错误:在堆限制附近的无效标记压缩分配失败 - JavaScript 堆内存不足

tomcat后台总是报这个错误,这是啥原因

由于堆大小增加,android中的内存不足错误

java上打开一个游戏显示java异常退出,内存不足,是怎么回事

js-数组

内存分配“错误:无法分配大小为 75.1 Mb 的向量”[重复]