【问题标题】:Android Out of Memory Exception & Paused ActivitiesAndroid 内存不足异常和暂停活动
【发布时间】:2013-03-01 16:18:16
【问题描述】:

我目前正在开发一个包含多个活动的 Android 应用程序。大多数情况下,该应用程序运行良好,但有时会出现Out of Memory Exception。 (通常在尝试为下一个活动加载大背景图像时)

我找不到任何明显的内存泄漏,所以我在异常发生时创建了一个堆转储(如here 所述)并尝试使用 MAT 对其进行分析。 我以前没有做过这样的事情,所以我不确定我到底应该寻找什么。我开始点击较大的字节对象,第二个似乎是属于ImageButton 的位图:

GC 根路径向我展示了一个 com.android.internal.policy.impl.PhoneWindow 实例:

问题是,我的整个应用程序中唯一的 ImageButton 在我的启动活动中,并且在该启动活动和崩溃活动之间至少还有 2 个活动。

那么为什么这张图片还在堆里呢? ImageButton 只是使用 android:src 属性在布局 xml 文件中定义,没有通过代码完成。堆中还有很多其他来自早期活动的较小对象。

我还编写了一个小 HelloWorld 应用程序,并查看了它的堆转储,看来,android 将以前活动的对象保存在堆中。如果是这种情况,那么有一天必须抛出Out of Memory Exception,所以我想我的分析一定有问题:/

【问题讨论】:

    标签: android exception android-activity out-of-memory heap-memory


    【解决方案1】:

    您可能想查看developer's documentation 中的位图管理。

    特别是:只要存在对位图的引用,位图就会保存在内存中。因此,如果您绝对必须为您的按钮使用大位图(如您所描述的),您可能会通过手动加载它并在您的 Activity 从视线中消失后立即使用recycle 做得更好。

    【讨论】:

    • 我现在正在回收大图像并为不再需要的活动调用 finish() - 不再出现 OOM 异常:)
    【解决方案2】:

    好的,我刚刚找到 this 并意识到,停止的活动(及其对象)只要在后堆栈上就不会被销毁。即使活跃的人需要更多的内存也不会。 有了这些知识,为什么像 ImageButton 这样的对象仍然在堆中的原因就很明显了。

    我仍然需要找出释放这些资源的最佳方式,但我想这很大程度上取决于应用程序本身,通常很难回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 2023-03-06
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多