【问题标题】:Android clear the back stack if out of memory如果内存不足,Android会清除后台堆栈
【发布时间】:2013-10-12 04:50:40
【问题描述】:

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

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

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

Android: Clear the back stack

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

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

【问题讨论】:

    标签: android memory


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      以下是在 Android 上追踪内存泄漏的绝佳指南:

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多