【问题标题】:Is using largeheap in Android manifest a good practice?在 Android 清单中使用大堆是一个好习惯吗?
【发布时间】:2015-05-28 00:06:12
【问题描述】:

我正在NDK 开发。它挂在Galaxy S3。为了测试,我将android:largeheap = "true" 放入Manifest。然后就没有挂起的问题了。 使用largeHeap="true" 是一个好习惯吗?

谷歌有没有可能因为这个标签而拒绝我的构建? 如何在不使用largeheap="true" 的情况下防止我的应用挂起?

【问题讨论】:

  • 如果您的应用程序实际上有一些高内存要求,那么您可以,但绝不是一个好的做法。
  • 程序员应该确定为什么他们挂起,而不是假设一些随机设置是一个神奇的修复。
  • @charlotte 如果我的回答成功让您知道您想知道什么,您能否将其标记为已回答?:)
  • 如果我的答案遗漏了什么,请告诉我! @夏洛特

标签: android android-ndk


【解决方案1】:

简答

不,如果你需要它,这不是一个糟糕的约定,因为它就在那里。

长答案

官方文档状态

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

一些开发者使用它来避免OOM异常,所以如果你只是为了避免一些OOM而使用它,这是一个非常非常糟糕的做法。

永远不要仅仅因为内存不足而请求大堆,并且 您需要快速修复。只有在您确切知道时才应该使用它 所有内存都分配在哪里以及为什么必须保留它


如果你确实需要更多空间也可以使用,你可以使用getMemoryClass()检查堆和getLargeMemoryClass()大堆。

但是,如果您可以避免使用 largeHeap,那将是最好的方法,正如官方文档所述:

然而,即使您确信自己的应用可以证明大堆的合理性, 您应尽可能避免提出要求。使用 额外的内存将越来越多地损害整个用户 经验,因为垃圾收集将需要更长的时间和系统 任务切换或执行其他任务时性能可能会变慢 常见的操作。
另外,大的堆大小不是 在所有设备上都相同,并且可能与常规堆完全相同 大小。因此,即使您确实请求大堆大小,您也应该调用 getMemoryClass() 检查常规堆大小并努力始终 保持在该限制以下。

我也建议你看看这里Managing Your App's Memory

【讨论】:

  • @EdGeorge 谢谢老兄:)!
【解决方案2】:

我个人会说,如果正确使用,它并不真正属于“好/坏做法”的范畴。

根据docs

大多数应用不应该需要这个,而是应该专注于减少 它们的整体内存使用情况以提高性能。启用此功能 也不保证可用内存的固定增加,因为 一些设备受到总可用内存的限制。

如果您已经尽了自己的能力一切来减少内存使用,并且仍然需要它,那么使用它并不是一件坏事。

如果您的应用挂起,您将需要直接解决这个问题 - largeHeap 并不是一个可以解决所有设备问题的魔杖。从以下 Android 培训文档的摘录中可以清楚地看出这一点:

[The] 请求大堆的能力仅适用于 可以证明需要消耗更多 RAM 的一小部分应用程序(例如 作为大型照片编辑应用程序)。 从不简单地请求大堆 因为你的内存已经用完了,你需要一个快速修复——你应该 仅当您确切知道所有内存在哪里时才使用它 分配以及为什么必须保留它。 - (source)

我还应该补充一点,Google 将不会拒绝您的应用使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2014-07-24
    相关资源
    最近更新 更多