1

在带有 Gingerbread 的华为 G300 上运行时,我的应用程序在 setContentView() 期间使用 5 分钟左右后由于内存不足而崩溃。

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

根据此处的建议,我已将所有对 startActivity 的调用替换为一个也调用 finish() 的实用函数。

Android:清除后台堆栈

这行得通;但没有更多的后退堆栈 - 后退按钮立即退出应用程序,这不是我想要的。

有没有办法只在我确实内存不足时才完成()应用程序,这是一种合理的方法吗?

4

3 回答 3

0

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

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

于 2013-10-12T04:57:55.203 回答
0

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

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

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

这是在 Android 上跟踪内存泄漏的一个很好的指南:

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

于 2013-10-12T04:59:07.330 回答
0

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

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

话虽如此,我只能回答你的一些问题:

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

我不知道使用主题是否更好,您必须尝试一下。

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

我认为 MAT 不显示本机内存数据。使用 dumpsys meminfo 的本机列来查看您为位图分配了多少内存。

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

于 2013-10-12T05:01:48.887 回答