我们可以在Elipse内存分析工具(在DDMS视图中)中看到的堆使用情况(已分配)与
Android设备上显示的同一应用程序的内存使用量大小有什么区别?:
设置 – > Apps->跑步
即使我通过在不需要时使对象为空来积极地尝试保留内存,后一个数字(运行应用程序屏幕上的内存使用大小)只会不断增加,我的应用程序最终因OutOfMemoryError而崩溃.然而,前者告诉我,我在合理的尺寸范围内.我也经常调用System.gc().这两者有区别吗?为什么会出现差异?关于如何解决这个问题的任何想法?
最佳答案 我所知道的两者之间最大的区别是垃圾收集的范围.
正常的垃圾收集,包括System.gc(),收集一些垃圾,然后停止.它并不是彻底清除堆积物以摆脱一切.那就是尽量减少垃圾收集对CPU的影响.
但是为MAT准备的堆转储实际上是一个完整的GC.
您的症状表明您分配内存的速度比GC可以回收的速度快.对此的主要解决方案是尝试分配更少的内存,或者更少地分配内存.例如,在可能的情况下,重用对象,位图缓冲区等,而不是试图让GC清理旧的东西并分配新的东西.