我目前正在开发一款包含多项活动的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
,所以我想我的分析肯定有些错误:/
答案 0 :(得分:0)
您可能希望查看developer's documentation中的位图管理。
特别是:只要存在引用,位图就会保留在内存中。因此,如果您必须为按钮使用大位图(正如您所描述的那样),那么只要您的活动从视线中消失,您可以手动加载并使用recycle做得更好。
答案 1 :(得分:0)
好的,我刚刚找到this并意识到,只要它们在后台堆栈上,就不会销毁已停止的活动(及其对象)。即使不是活跃的人需要更多的记忆。 有了这些知识,很明显为什么像ImageButton这样的对象仍然在堆中。
我仍然需要找出释放这些资源的最佳方法,但我想这很大程度上取决于应用程序本身,一般来说很难回答。