我有一个非常耗费内存的应用程序 - 处理大型位图。我已经使用众所周知的处理这些位图的技术调整了应用程序(请不要在答案的教程中链接...),以便它运行正常,没有任何OutOfMemoryError
例外,但只在运行HC和ICS的设备上,在Jelly上Bean相同的应用程序的内存消耗几乎高出80%,导致用户体验不佳,应用程序滞后和缓慢。
我准备了一个简单的测试,刚刚在Eclipse中使用模板创建了最简单的Android应用程序;该应用程序只有一个活动与背景位图(1280 x 800)。在使用Android 3.1(华硕A500)的设备上,它分配:
01-23 12:28:02.402: D/dalvikvm(31706): GC_FOR_ALLOC freed 65K, 4% free 6559K/6787K, paused 17ms
01-23 12:28:02.402: I/dalvikvm-heap(31706): Grow heap (frag case) to 10.355MB for 4096016-byte allocation
01-23 12:28:02.432: D/dalvikvm(31706): GC_CONCURRENT freed 1K, 3% free 10558K/10823K, paused 1ms+2ms
在带有JellyBean 4.2.1的Nexus 7上,它分配:
01-23 12:13:49.740: D/dalvikvm(23815): GC_FOR_ALLOC freed 84K, 4% free 7464K/7700K, paused 18ms, total 18ms
01-23 12:13:49.750: I/dalvikvm-heap(23815): Grow heap (frag case) to 11.338MB for 4096016-byte allocation
01-23 12:13:49.770: D/dalvikvm(23815): GC_FOR_ALLOC freed 1K, 3% free 11463K/11704K, paused 23ms, total 23ms
01-23 12:13:49.800: D/dalvikvm(23815): GC_CONCURRENT freed <1K, 3% free 11463K/11704K, paused 2ms+2ms, total 23ms
01-23 12:13:49.900: D/dalvikvm(23815): GC_FOR_ALLOC freed <1K, 3% free 11463K/11704K, paused 12ms, total 13ms
01-23 12:13:49.920: I/dalvikvm-heap(23815): Grow heap (frag case) to 18.259MB for 7259056-byte allocation
01-23 12:13:49.940: D/dalvikvm(23815): GC_FOR_ALLOC freed 0K, 2% free 18552K/18796K, paused 16ms, total 16ms
01-23 12:13:49.960: D/dalvikvm(23815): GC_CONCURRENT freed <1K, 2% free 18552K/18796K, paused 3ms+2ms, total 17ms
所以我有两个问题:
1,为什么在主要活动的背景上只使用一个位图时,应用程序会消耗这么多内存?
2,为什么运行相同应用程序时带有JellyBean的设备的内存消耗几乎高出80%?
EDIT1:
所有设备都具有相同的屏幕分辨率:1280 x 800 px
答案 0 :(得分:1)
我遇到了同样的事情 - 不幸的是我怀疑这是因为最新版本的android会尝试尽可能多地使用3D加速器这一事实 - 他们会拍摄你的图像并将其传递到然后使用3d加速器渲染用户看到的实际像素。这就是为什么你会看到更高的内存消耗。
至于可以做些什么 - 不幸的是并不多。这种更高的内存使用率导致整体更加流畅的UI(这是项目黄油,在Android 4.1中出现)。如果您已经查看了各种教程,例如googles displaying bitmaps efficiently,那么我可以建议尝试在清单的应用程序元素中启用largeHeap - 这对我有用。
此外,根据您的应用程序的工作方式,可能会回收位图。来自谷歌的This DevBytes video解释了如何。