Android 将largeHeap设置为true有什么好处?

Android 将largeHeap设置为true有什么好处?,android,android-memory,android-largeheap,Android,Android Memory,Android Largeheap,我有一个包含大量类的应用程序,其中还包含许多库,我正在设置android:largeHeap=“true”当我遇到内存问题时,我的清单文件代码已附加 <application android:name=".MyApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" and

我有一个包含大量类的应用程序,其中还包含许多库,我正在设置
android:largeHeap=“true”
当我遇到内存问题时,我的清单文件代码已附加

<application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="My Huge Application"
        android:largeHeap="true"
        android:logo="@drawable/logo"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme" >
</application>

我不得不问,这是一个好的做法吗?
请建议使用它的优点和缺点(优点和缺点)。

是否应使用大型Dalvik堆创建应用程序的进程。这适用于为应用程序创建的所有进程。它仅适用于加载到进程中的第一个应用程序;如果您使用共享用户ID来允许多个应用程序使用一个进程,那么它们都必须一致地使用此选项,否则将产生不可预测的结果

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

实际上是增加应用程序分配内存的工具

没有明确定义是否需要使用此标志。如果你需要更多的内存,Android为你提供了一个增加内存的工具。但使用的必要性在于定义自己。

我有一个几乎有50门课的应用程序

我认为这没什么问题。导致outOfMemory错误的原因通常是在应用程序中加载太多图像或类似的内容。如果您不喜欢使用大堆,则必须找到一种使用内存进行优化的方法


您还可以使用图像加载库,如、或。它们都有在内存和/或磁盘上缓存图像的功能。

对于这里的聚会来说太晚了,但无论如何我会提供我的0.02美元。
使用android:largeHeap=“true”不是一个好主意,下面是谷歌的摘录解释了这一点

但是,请求大型堆的功能仅适用于 可以证明需要消耗更多RAM的一小部分应用程序(例如 作为一个大型照片编辑应用程序)。不要简单地请求一个大堆 因为您的内存不足,需要快速修复,您应该 只有当你确切地知道你所有的记忆都在哪里时才使用它 分配以及为什么必须保留。然而,即使你很自信 你的应用程序可以证明大堆的合理性,你应该避免请求它 尽可能多。使用额外的内存将越来越困难 因为垃圾而损害了整体用户体验 收集将花费更长的时间,并且当 任务切换或执行其他常见操作

这是文档的完整链接

更新

在处理
内存不足错误后,我想说,将此添加到清单中以避免oom问题不是罪过,正如下面@Milad指出的那样,它不会影响应用程序的正常工作

更新2

以下是一些处理
内存不足错误的技巧

1) 使用android提供的这些回调函数
onLowMemory
ontrimmory(int)
并清除图像缓存(如毕加索、格莱德、弗雷斯科……),您可以阅读更多关于它们的信息,
2) 压缩文件(图像、pdf)
3) 了解如何更有效地处理位图
4) 在生产推进之前,定期使用棉绒,以确保代码光滑、整洁
不笨重

我认为这是一个非常有效的问题,让我补充一些关于使用此选项的优缺点的细节

你得到的:

  • 显然,您会得到更大的堆,这意味着降低
    OutOfMemoryError
    的风险
你失去了什么:

  • 您可能会丢失一些帧,这可能会导致可见的挂接。堆越大,垃圾收集时间越长。因为垃圾收集器基本上必须遍历整个活动对象集。通常,垃圾收集暂停时间约为5毫秒,您可能认为几毫秒没什么大不了的。但每一毫秒都有意义。安卓设备必须每16毫秒更新一次屏幕,更长的GC时间可能会使您的帧处理时间超过16毫秒的界限,这可能会导致可见的挂接

  • 切换应用程序的速度也会变慢。Android系统可能会从最近使用最少的进程开始杀死LRU缓存中的进程,但也会考虑哪些进程占用内存最多。所以,如果你使用更大的堆,你的进程在后台时更有可能被终止,这意味着当用户想要从其他应用切换到你的应用时,可能需要更长的时间。另外,当您的进程处于前台时,其他后台进程更有可能被踢出,因为您的应用程序需要更大的内存。这意味着从你的应用程序切换到其他应用程序也需要更长的时间

结论:

尽量避免使用
largeHeap
选项。您可能很难注意到性能下降和糟糕的用户体验

如果您必须使用(并保留)大量内存,那么是的,您可以而且应该使用
android:largeHeap=“true”
。但如果你真的使用了它,你应该准备好让你的应用程序在前台出现时从内存中刷新

所谓“做好准备”,我的意思是您应该针对这种可能性进行设计,以便尽可能高效地编写
onStop()
onResume()
方法,同时确保以一种向用户呈现无缝外观的方式保存和恢复所有相关状态

有三种方法与此参数相关:
maxMemory()
getMemoryClass()
,以及
getL