4

我们可以在 Elipse 内存分析工具(在 DDMS 视图中)中看到的堆使用量(已分配)与此处显示的 Android 设备上同一应用程序的内存使用量大小有什么区别?:

设置->应用程序->运行

即使我积极地尝试通过在不需要对象时立即将对象设为 null 来保留内存,但后一个数字(运行应用程序屏幕上的内存使用量大小)只会不断增加,我的应用程序最终由于 OutOfMemoryError 而崩溃。然而,前者向我表明我的体型在合理范围内。我也经常调用 System.gc()。两者有区别吗?为什么会出现差异?关于如何解决这个问题的任何想法?

4

2 回答 2

1

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

正常的垃圾收集,包括System.gc(),收集一些垃圾,然后停止。摆脱所有东西并不是彻底清除堆。那就是尽量减少垃圾收集对 CPU 的影响。

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

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

于 2012-11-23T16:52:49.007 回答
0

如果内存从未被释放,听起来你的应用程序某处有内存泄漏。这意味着您在某处维护对正在重新创建的大对象(如 Activity 或位图)的强引用,这就是调用 System.gc() 没有任何区别的原因。

我建议从 google IO 2011 观看以下有关android 内存管理的内容。它让您知道如何使用 eclipse 内存分析器工具,该工具对于调试此类错误非常有用

于 2012-11-23T17:00:43.683 回答