为什么空的Android ICS应用几乎占据了所有堆大小?

时间:2012-10-11 10:35:57

标签: android heap heap-memory

我正在开发一款针对SDK构建的Android游戏应用程序> = 8.我总是在Android 2.2手机下进行测试,从未遇到过问题。当我搬到安装了ICS的Nexus手机时,我开始遇到堆内存分配问题。我试图删除应用程序中的所有内容,以查看我在哪里遇到内存泄漏问题或奇怪的分配(在Eclipse下使用DDMS和MAT),直到我决定开始一个空的活动而不再做任何事情。

在Android 2.2下,启动时的堆大小约为2.0MB,而Android 4.1下的堆大小约为11MB。为什么会有这么大的差异?

更多,当我在ICS上播放我的应用程序堆大小时,垃圾收集器快速启动释放内存,整个应用程序变得缓慢且FPS非常低。在Android 2.2下,一切都非常顺畅和干净,没有任何单一问题。

有没有人可以建议我这两个系统之间的区别在哪里?我不想谈论我的应用程序实现(我已经花了两周优化代码,内存分配和保留以及其他所有内容。不能做更多),但我想了解所有内存在app启动时的位置。此外,ICS似乎需要更多的内存来加载和保留位图和drawable。

1 个答案:

答案 0 :(得分:0)

好吧,我可能迟到了,但我找出了你(和我)问题的根源。

在Android 3.0之前(不确定这是否在整个1.x / 2.x系列中)所有与位图相关的内存都没有存储在堆上。因此,使用3.0,他们开始在堆上找到所有内容。我不确定为什么空应用程序占用11MB,我只能猜测它与应用程序中使用的默认Android位图有关。

现在还有另一个问题:在早期版本的Android中,只有一个'drawable'文件夹,而不是'drawable-hdpi','drawable-mdpi'等文件夹。出于某种原因,当从'drawable'文件夹加载图像时,它占用了大量的空间。解决方案是将图像的不同分辨率变体添加到 all drawable-Xdpi(其中X是l,m,h或xh)文件夹。它将我的起始堆大小从大约26MB减少到16MB。即使您没有调整它们的大小,只是将它们复制粘贴到文件夹中,它仍然会导致位图大小发生相当大的变化。

我希望通过张贴这个来帮助一些人。

-Z