3

我有一个非常消耗内存的应用程序 - 处理大型位图。我已经使用众所周知的技术调整了应用程序来处理此类位图(请不要在答案中提供教程链接......),以便它可以正常运行,没有任何OutOfMemoryError异常,但仅在运行 HC 和 ICS 的设备上,在 Jelly Bean 上相同的应用程序有内存消耗增加了近 80%,这导致糟糕的用户体验,应用程序滞后且缓慢。

我准备了一个简单的测试,只是在Eclipse中使用模板创建了最简单的Android应用;该应用程序只有一个带有背景位图 (1280 x 800) 的活动。在装有 Android 3.1 (Asus 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%?

编辑1:

所有设备都具有相同的屏幕分辨率:1280 x 800 像素

4

1 回答 1

1

我遇到了同样的事情 - 不幸的是,我怀疑这是由于最新版本的 android 会尝试尽可能多地使用 3d 加速器 - 他们会复制您的图像并将其传递到 3d 加速器然后使用 when 来渲染用户看到的实际像素。这就是为什么您会看到更高的内存消耗。

至于可以做些什么 - 不幸的是不多。这种更高的内存使用导致整体上更加流畅的 UI(这是项目黄油,在 android 4.1 中出现)。如果您已经查看了各种教程,例如高效显示位图的 google,那么我所能建议的就是尝试在清单的应用程序元素中打开largeHeap - 这对我有用。

此外,根据您的应用程序的工作方式,可能会回收位图。 这个来自谷歌的 DevBytes 视频解释了如何。

于 2013-02-03T07:28:07.507 回答