2

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

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

在此处输入图像描述

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

在此处输入图像描述

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

那么为什么这个图像仍然在堆中?使用ImageButtonandroid:src 属性在布局 xml 文件中简单地定义,没有通过代码完成。堆中还有许多来自早期活动的其他较小对象。

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

4

2 回答 2

0

您可能想查看开发人员文档中的位图管理。

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

于 2013-03-01T17:15:12.213 回答
0

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

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

于 2013-03-01T22:54:36.120 回答