【问题标题】:Memory usage between Android 2.2 and 2.3Android 2.2 和 2.3 之间的内存使用情况
【发布时间】:2011-02-22 22:49:42
【问题描述】:

我正在开发一个包含许多图像的应用程序。我注意到 我的应用程序的内存使用量在 Android 2.3 中比在 在 Android 2.2 中 - 最终导致 OutOfMemory 错误,而 加载位图。在研究这个时,我记录了结果 第一个onResume中的Debug.getNativeHeapAllocatedSize() 活动。在 Android 2.2 中,这会输出 5MB。在 Android 2.3 中,这 输出 17MB。

我创建了一个示例应用程序来尝试进一步缩小范围。 示例应用程序有 2 个活动:第一个有一个小图像和一个 按钮启动第二个活动;第二个活动有几个 ScrollView 中的大图像。您可以在此处下载示例: http://dl.dropbox.com/u/21709517/MemoryUsageExample.zip 运行此示例时,Debug.getNativeHeapAllocatedSize() 报告 在 2.2 和 2.3 中开始第一个活动后分配 3MB。 启动第二个activity后,Android 2.2依然报3MB Android 2.3 报告分配了 17MB。运行“亚行 shell dumpsys meminfo test.example" 显示相同类型的结果。

为什么 Android 2.2 和 2.3 之间存在如此巨大的差异? 更重要的是,我应该做些什么不同的事情来防止 在 Android 2.3 上使用这么多内存?

-----更新-----

查看 Romain Guy 发布的信息后,我决定多尝试一下各种加载选项。结果表明,强制将图像加载为 RGB_565 确实会减少 Android 2.3 中的内存,但它仍然使用超过 2.2 的内存。在我的示例应用程序中,Android 2.3 现在使用 10MB,而 Android 2.2 现在使用 3MB。此外,我尝试使用 ARGB_8888 强制 32 位。在这种情况下,Android 2.3 使用 17MB,但 Android 2.2 继续只使用 3MB。可在此处找到更新的示例:http://dl.dropbox.com/u/21709517/MemoryUsageExample2.zip

造成这些差异的原因是什么?是否需要做更多工作才能使内存使用量更接近 Android 2.2?此外,有没有办法将通过 xml 布局创建的图像强制转换为特定格式?这可以在应用程序范围内设置吗?谢谢。

-----更新 2-----

根据this thread,无法强制通过 xml 膨胀加载的图像为特定格式。

我仍然希望得到关于为什么 Android 2.2 和 Android 2.3 在强制 16 位或 32 位后使用不同内存量的答案。

【问题讨论】:

标签: android memory


【解决方案1】:

Android 2.3 现在默认加载 32 位图像。您可以使用 BitmapFactory.Options 强制 16 位格式。

http://www.curious-creature.org/2010/12/04/gingerbread-and-32-bits-windows/http://www.curious-creature.org/2010/12/08/bitmap-quality-banding-and-dithering/

【讨论】:

  • 谢谢!这就解释了。如果在 Android 2.3 发行说明中提到这一点,那就太好了。
  • 有没有办法为在 XML 布局膨胀期间加载的图像选择格式?
  • 我可能已经在接受答案时抢了先机。请参阅上面的更新。
【解决方案2】:

我的猜测是。 Android 操作系统将一些图像预加载到本机堆中。预加载的图像数量取决于每个进程的 OS VM 预算。由于 2.3 将 VM 预算增加到 32M,因此它为每个进程预加载了比 2.2 设备更多的图像。因此,您在 2.3 中看到了更多的本机堆使用情况。这只是我的猜测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多