在Android中使用largeheap是一个很好的做法吗?

cha*_*tte 8 android android-ndk

我正在开发中NDK.它挂起来了Galaxy S3.为了测试,我投入android:largeheap = "true"Manifest.然后没有悬而未决的问题.这是一个好用的做法largeHeap="true"吗?

由于此标记,Google是否有机会拒绝我的版本?如何在不使用的情况下阻止我的应用挂起largeheap="true"

Sid*_*Sid 20

简答

不,如果你需要它,这不是一个糟糕的协议,因为它是存在的.

答案很长

官方文件说

是否应使用大型Dalvik堆创建应用程序的进程.这适用于为应用程序创建的所有进程.
它仅适用于加载到进程中的第一个应用程序; 如果您使用共享用户ID以允许多个应用程序使用进程,则它们都必须一致地使用此选项,否则它们将具有不可预测的结果.
大多数应用程序不应该需要这个,而应该专注于减少其整体内存使用量以提高性能.启用此功能也不能保证可用内存的固定增加,因为某些设备受其总可用内存的限制.

一些开发人员使用它来避免OOM的问题,所以如果你使用它只是为了避免一些OOM,这是一个非常非常糟糕的问题.

永远不要因为内存不足而需要快速修复而请求大堆.只有当您确切知道所有内存的分配位置以及必须保留的原因时,才应使用它


如果你真的需要更多的空间可以使用它,你可以 getMemoryClass()用来检查堆和getLargeMemoryClass()大堆.

但是,如果您可以避免使用largeHeap,这将是最好的方式,因为官方文档仍在继续:

然而,即使你确信你的应用程序可以证明大堆的合理性, 你应该避免在任何可能的范围内请求它.使用额外的内存将越来越不利于整体用户体验,因为当任务切换或执行其他常见操作时,垃圾收集将花费更长时间并且系统性能可能更慢.
此外,所有设备上的大堆大小都不相同,并且可能与常规堆大小完全相同.因此,即使您确实请求大堆大小,也应该调用getMemoryClass()来检查常规堆大小,并努力始终保持低于该限制.

我还建议你看看这里管理你的应用程序的内存


Ed *_*rge 6

我个人会说,如果使用得当,它并不属于"好/坏做法"的范畴.

根据文件:

大多数应用程序不应该需要这个,而应该专注于减少其整体内存使用量以提高性能.启用此功能也不能保证可用内存的固定增加,因为某些设备受其总可用内存的限制.

如果你已经尽力减少内存使用量,并且仍然需要它,那么使用它并不是一件坏事.

如果您的应用程序挂起,您将需要直接解决这个问题 - 这largeHeap不是一个魔术棒,会让所有设备的问题都消失.从以下Android培训文档的摘录中可以清楚地了解这一点:

[]请求大堆的能力仅适用于一小部分可以证明需要消耗更多RAM的应用程序(例如大型照片编辑应用程序).永远不要因为内存不足而需要快速修复而请求大堆 - 只有当您确切知道所有内存的分配位置以及必须保留的原因时才应使用它.- (来源)

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