【问题标题】:Very high memory consumption on Nexus 7 with Android Jelly Bean带有 Android Jelly Bean 的 Nexus 7 上的内存消耗非常高
【发布时间】:2013-01-23 11:42:16
【问题描述】:

我有一个非常消耗内存的应用程序 - 处理大型位图。我已经使用众所周知的技术调整了应用程序来处理此类位图(请不要在答案中提供教程链接...),以便它运行良好,没有任何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%?

EDIT1:

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

【问题讨论】:

  • 使用 Jelly bean 改进了 UI 的流畅度。这可以通过双缓冲某些图像和/或显示区域来实现吗?
  • 查看目标 API 设置为 15 的 Bitmap 文档,有两组方法变为浅灰色,可能会影响内存使用:isPremultiplied()hasMipMap()。也许其中一个在平台更新中将其默认值从 false 切换为 true?

标签: android android-4.2-jelly-bean


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-01-10
    • 2017-10-30
    • 2012-05-18
    • 2014-01-07
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多