如果内存不足,Android会清除后台堆栈

时间:2013-10-12 04:50:41

标签: android memory

当使用Gingerbread在华为G300上运行时,我的应用程序在setContentView()中使用5分钟后崩溃,因为内存不足。

每个单独的页面都没有使用太多内存,但是从某些研究来看,内存似乎在后面的堆栈中累积。

根据这里的建议,我用一个也调用finish()的实用函数替换了我对startActivity的所有调用。

Android: Clear the back stack

这有效;但是没有更多的后台 - 后退按钮立即退出应用程序,这不是我想要的。

当我实际耗尽内存时,有没有办法只完成()应用程序,这是一种合理的方法吗?

3 个答案:

答案 0 :(得分:0)

您应该搜索内存泄漏。如果你使用eclipse,那么一个好的工具就是MAT。 MAT并不难处理,你可以快速获得一些非常有价值的信息。

我在Android上看到的一个最常见的错误是保留对已经死亡的上下文的引用。例如,让一个单例持有您创建的其中一个活动的引用。如果应用程序编码良好,则没有真正的理由让应用程序崩溃。

答案 1 :(得分:0)

Android活动管理器旨在管理这个确切的问题。操作系统旨在终止后台活动,然后使用onSaveInstanceState和onRestoreInstanceState恢复它们。

你的应用程序随着时间累积内存使用量这一事实向我表明你可能在某处发生了Context泄漏(对视图,适配器等的静态引用,其中有一个对Context的引用),或者你有一个缓存机制,不适应你的内存堆,或其他导致内存不足的情况。

我非常怀疑这是后堆栈中的活动导致内存不足。

以下是关于在Android上追踪内存泄漏的精彩指南:

http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html

答案 2 :(得分:0)

在Android中,内存是一个非常棘手的主题。

每个应用都会根据设备获得堆内存限制。这个堆内存是dalvik内存加上本机内存,你可以将它看作dumpsys meminfo结果中的总列。 dalvik内存处理除了位图之外的所有内容,这些内容在本机内存中分配(在Honeycomb之前的Android版本中也是如此)。

说过我只能回答你的一些问题:

据我所知,Android将始终为Bitmaps分配内存,即使它们是相同的。因此,在您的情况下,每个活动都会为您的背景分配内存。

我不知道与主题合作是否更好,你必须尝试。

一方面,当设备有足够的内存来处理下一个活动时,不会回收活动。当您按下后退按钮时,每个活动都被推到一堆。如果Android需要更多内存,它会从堆中删除一个活动来释放其内存(回到第一个问题,也许这就是不共享内存的原因)。另一方面,您可以设置活动launchMode来更改此行为(请查看此处)。

我认为MAT不会显示本机内存数据。使用dumpsys meminfo的本机列来查看您为Bitmaps分配的内存量。

我自己很难处理OutOfMemory问题。现在我对它的工作方式有了更清晰的认识,我能够处理大文件而不会耗尽内存。我强烈推荐这两个对我有帮助的资源: