为什么Android 4.0 / 冰淇淋三明治分配如此多的堆内存?
为什么Android 4.0 / 冰淇淋三明治分配如此多的堆内存?
我注意到在我的Galaxy Nexus上,android.content.res.Resources分配了大约11MB的内存。我是在使用DDMS进行分析时发现的,通过选择“Dump HPROF文件”选项。所以,我花了两个小时试图确定这个分配是由我的代码还是支持库中的某些东西引起的。我删除了所有的数据、大量的类和所有的库,但没有看到任何改变。在活动的onCreate()方法的开头放置了一个断点后,它显示已经存在了11MB的分配。\n在彻底困惑之后,我决定连接我的已Root的CM7运行的Nook Color,看看它对于完全相同的应用程序报告的初始内存使用情况。MAT报告的最糟糕的内存“问题嫌疑人”只有896KB。\nICS是不是太庞大了?我是否漏掉了什么?据我所知,我的应用程序功能正常,但堆使用量显示为97%满,让我担心可能会发生故障。\n如果有帮助的话,MAT指示消耗所有内存的主要对象是位图、BitmapDrawables和NinePatchDrawables。我不明白这些分配是从哪里来的。
为什么Android 4.0 / Ice Cream Sandwich会分配如此大的堆内存?
在Honeycomb之前(<3.0),位图是在本地堆中分配的,并且不会出现在Dalvik堆转储中,如Eclipse MAT中所示。这种本地分配仍然会对应用程序的最大Dalvik堆限制产生影响,并且在接近低内存情况时会导致垃圾回收以大约正确的时间运行。可以使用Debug.getNativeHeapAllocatedSize()
来测量此使用情况。
自Android 3.0(包括ICS)以来,它现在在Dalvik堆中的正常字节数组中分配位图的像素数据。这样做的实际效果是对位图的垃圾回收行为更好/更简化(因为它们可以以更正统的方式处理),并且可以在Dalvik堆转储中跟踪位图分配。
我认为特定应用程序的实际内存使用情况在Honeycomb之前和更近期的版本之间并没有显著差异,这只是一种另类的会计实践。
原文链接:Memory Analysis for Android
相关讨论:BitMaps in Android