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

15

我注意到在我的Galaxy Nexus上,android.content.res.Resources正在分配约11MB的内存。我发现这个问题是在使用DDMS和"Dump HPROF file"选项对事物进行分析时发现的。因此,我花了两个小时尝试查看这个分配是否由我的代码或支持库中的某些内容引起的。我删除了所有数据,大量的类,所有库,但没有看到任何变化。在活动的onCreate()方法的开始处设置断点后,它显示11MB的分配已经存在。

在彻底困惑之后,我决定连接我的运行CM7的rooted Nook Color,查看完全相同应用程序的初始内存使用情况。MAT报告的最差情况下的内存“问题嫌疑人”仅为896KB。

ICS真的那么臃肿吗?我错过了什么吗?据我所知,我的应用程序正在正确运行,但堆使用情况指示97%已满,这让我担心可能会出现故障。

如果有帮助的话,MAT表明占用所有内存的主要对象是Bitmaps、BitmapDrawablesNinePatchDrawables。我不明白这些分配来自哪里。


嗯,也许你可以尝试用最少的条件制作一个新的应用程序,看看它在那里使用了多少。 - FabianCook
我已经尝试过这个,有时候开启硬件加速并链接兼容库后,在GN上可用堆内存少于10%。 - Ljdawson
1个回答

6

在Honeycomb版本之前(<3.0),位图是在本地堆中分配的,并且不会出现在Dalvik堆转储中,如Eclipse MAT所示。这种本地分配仍然有助于应用程序的最大Dalvik堆限制,并且在接近低内存情况时仍会导致垃圾回收运行。可以使用Debug.getNativeHeapAllocatedSize()来测量此使用情况。

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

我认为特定应用程序的实际内存使用情况在Honeycomb版本之前和更近期的版本之间并没有显着不同,这只是一种替代会计实践的问题。

Android内存分析

Android中的位图


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接