安卓运行应用程序内存使用情况



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

设置->应用->运行

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

据我所知,两者之间最大的区别是垃圾回收的范围。

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

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

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

如果内存从未释放,听起来您的应用程序中某处会出现内存泄漏。这意味着您在某处维护对正在重新创建的大型对象(如活动或位图)的强引用,这就是为什么调用 System.gc() 没有区别的原因。

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

最新更新