2012-11-23 46 views
4

我们可以在Elipse内存分析工具(在DDMS视图中)看到的堆使用情况(分配)和Android设备上显示的同一应用的内存使用情况大小之间有什么区别? :Android正在运行的应用程序内存使用情况

设置 - >应用 - >运行

即使我积极地试图通过使物体空,只要是没有必要,他们,​​后者的数量(内存使用量的大小来保存记忆在运行应用程序屏幕上)只会不断增加,并且由于OutOfMemoryE,我的应用程序最终崩溃RROR。然而,前者表明我的身材合理。我也调用了很多System.gc()。两者有什么不同?为何差异?关于如何解决这个问题的任何想法?

+0

在其Android版本,你在这个测试?你在使用位图吗? –

+0

我正在从事ICS工作,但尽量保持向后兼容性。是的,我正在使用Bitmaps,这是我的恐惧 - 当活动退出时,是不是应该清除这些内容?显式GC后如何?如果不是,我应该手动执行此操作吗?怎么样?无论如何,我正在使用的位图不是大文件 - 它们在演绎后大小是否增加? –

回答

2

我知道的两者之间最大的区别是垃圾收集的范围。

正常垃圾收集,包括System.gc(),收集一些垃圾,然后停止。它不是完全摆脱一切的堆。这是为了尽量减少垃圾收集对CPU的影响。

为MAT准备的堆转储实际上是一个完整的GC。

您的症状表明您分配内存的速度比GC可以回收的速度快。对此的主要解决方案是尝试分配较少的内存,或者分配较少的内存。例如,在可能的情况下,重用对象,位图缓冲区等,而不是试图让GC清理旧东西,并随时分配新东西。

+0

实际上,更具体地说,我有一些我主要使用的活动(类)成员对象,并且这些应该在方法返回后立即生效,对吧?但它并非完全如此 - 即使我另外让它们为空,内存也只是在增加。 –

+0

@DivyanshGoenka:“我有一些我主要使用的活动(类)成员对象,一旦他的方法返回,这些对象应该被GCed,对吧?” - 一旦活动被破坏,活动的非静态数据成员就有资格获得GC。我不知道“一旦他的方法返回”是什么意思。 – CommonsWare

+0

对不起,只是一个错字。我的意思是我通常会尽可能地限制我的成员的范围,以便他们能够更快速地工作。当这种情况没有发生时,我甚至开始在范围的末尾使它们变为空,认为这可能有帮助。但是,情况并非如此。我在我的问题中描述的两个数字之间存在巨大差异。有可能(虽然我不这么认为)明确的GC实际上是在破坏它吗?有没有什么办法像你明确说的那样得到完整的扫描? –

0

这听起来像你有一个内存泄漏在你的应用程序的某个地方,如果内存从来没有释放。这意味着在某个地方你正在维护一个正在被重新创建的大对象的强引用(就像Activity或Bitmap),这就是为什么调用System.gc()没有任何区别。

我建议看从谷歌IO 2011年它可以让你知道如何使用Eclipse的内存分析工具,它是用于调试这种错误的非常有用的memory management in android以下

+0

感谢您的回应,这个视频已经非常有用! –

相关问题