【问题标题】:Is it possible to use more than maximum android heap? [duplicate]是否可以使用超过最大 android 堆? [复制]
【发布时间】:2015-05-07 13:14:03
【问题描述】:

如果单个应用程序只能使用 32mb 堆,为什么 android 设备需要 1 或 2gb 的 RAM?我无法将大图像加载到 RAM 中,例如 3000x3000(只有 34mb)。

【问题讨论】:

标签: java android heap-memory


【解决方案1】:

可用,here,在 android 文档中,使用

android:largeHeap="true"

将允许您使用更大的堆大小,但建议您尽可能使用较小的图像。

您的应用程序的进程是否应该使用大型 达尔维克堆。这适用于为 应用。它仅适用于第一个加载到 过程;如果您使用共享用户 ID 来允许多个 应用程序使用一个进程,他们都必须使用这个选项 始终如一,否则他们将产生不可预测的结果。大多数应用程序应该 不需要这个,而是应该专注于减少他们的整体 内存使用以提高性能。启用此功能也不会 保证可用内存的固定增加,因为某些设备 受到总可用内存的限制。

要在运行时查询可用内存大小,请使用方法 getMemoryClass() 或 getLargeMemoryClass()。

【讨论】:

  • 但是 android 2.3.3 呢?它不支持 largeHeap
  • Android 2.3.3 与后来的版本相比所占的比例太小,以至于支持该版本几乎毫无意义。我自己执行的最后一次检查表明,大约 3% 的 Android 用户使用的是 2.3.3 或更早版本。此外,3000x3000 大小的图像在运行的设备上加载/渲染所需的时间太长指示的android版本。
【解决方案2】:

是的,这是真的。有些人可能会争辩说,这在为 Android 开发应用程序时构成了最大的挑战之一,尤其是那些需要加载大图像的应用程序。

克服这个问题的最佳方法是在使用 Android 应用程序时简单地接受这个限制,并且在创建位图时要非常小心。原则上,内存中的位图不应超过一次在屏幕上显示的数量。这意味着加载较小的位图,并回收不再使用的位图。

但是,有时您需要一次保存很多位图,而这个数量超出了每个应用程序的内存限制。

为此,也许最好的选择是将这些位图渲染为 OpenGL-ES 纹理。

当您在 Android 中使用 OpenGL-ES 时,纹理(本质上是位图的 OpenGL 名称)保存在设备的堆上,并且不受与普通位图相同的内存限制的限制。在这里,您可以充分利用设备的 RAM。

OpenGL-ES 对于开发人员来说被认为是一个稍微“高级”的主题,但是如果您遵循一些教程,例如 this one,您可以很快地设置一些基本的东西。

最后,您还可以在清单文件中定义largeHeap="true"。这将为您的应用程序分配更多内存,但最终,您将遇到与以前相同的问题 - 无法访问完整的设备内存。如果您只需要更多内存,这是一个很好的解决方案,但如果您的内存需求非常大,那么可能就不够了。

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 2010-11-08
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2020-01-05
    • 2020-08-10
    相关资源
    最近更新 更多