为什么Android 4.0 /冰淇淋三明治分配太多的堆内存?

我注意到在我的Galaxy Nexus上, android.content.res.Resources分配了大约11MB。 我发现这是因为我正在使用DDMS和“ Dump HPROF file ”选项进行分析。 所以,我花了两个小时试图查看是否分配是由于我的代码或支持库中的东西。 我删除了所有的数据,大量的课程,我所有的图书馆,没有看到任何改变。 在活动的onCreate()方法的开头,在我的代码中放置了一个断点后,它表明11MB分配已经存在。

在被彻底搞糊涂之后,我决定连接运行CM7的我的Nook Color,看看这个应用程序的初始内存使用情况。 MAT报告的最坏情况记忆“问题可疑”仅在896KB。

ICS是头重脚轻吗? 我在这里错过了什么? 据我所知,我的应用程序运行正常,但有使用率表示97%已满我担心潜在的失败。

如果有帮助,MAT表示消耗所有内存的主要对象是Bitmap, BitmapDrawablesNinePatchDrawables 。 我不明白这些分配是从哪里来的。

Solutions Collecting From Web of "为什么Android 4.0 /冰淇淋三明治分配太多的堆内存?"

前蜂窝(<3.0),位图分配在本地堆中,并没有出现在Dalvik堆转储中,如Eclipse MAT等所示。这种本地分配仍然对应用程序的最大Dalvik堆限制作出贡献,并且仍然导致垃圾收集在接近内存不足的情况下大概正确运行。 这个用法可以用Debug.getNativeHeapAllocatedSize()来衡量。

自从Android 3.0(包括ICS),它现在分配在Dalvik堆普通字节数组中的Bitmaps的像素数据。 这样做的实际效果是更好/简化了位图的垃圾收集行为(因为它们可以用更正统的方式处理),并且能够跟踪Dalvik堆转储中的位图分配。

我不认为在Honeycomb和更新版本之间,特定应用程序的实际内存使用情况有很大差异,这只是一个替代会计实践的问题。

内存分析为Android

Android中的BitMaps