关于android:将largeHeap设置为true有什么好处?

What are advantages of setting largeHeap to true?

我有一个将近设置50个类的App,我正在设置android:largeHeap="true",如下所示。 这是一个好习惯吗?

1
2
3
4
5
6
7
8
9
10
<application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="Mall"
        android:largeHeap="true"
        android:logo="@drawable/logo_for_up"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme">
</application>

请提出使用它的优点和缺点。

我遇到内存问题,这就是为什么我问这个问题。


对于这里的聚会来说太晚了,但是我还是会提供我的0.02 $。
使用android:largeHeap="true"并不是一个好主意,以下是Google的摘录对此进行了解释,

However, the ability to request a large heap is intended only for a
small set of apps that can justify the need to consume more RAM (such
as a large photo editing app). Never request a large heap simply
because you've run out of memory and you need a quick fix—you should
use it only when you know exactly where all your memory is being
allocated and why it must be retained. Yet, even when you're confident
your app can justify the large heap, you should avoid requesting it to
whatever extent possible. Using the extra memory will increasingly be
to the detriment of the overall user experience because garbage
collection will take longer and system performance may be slower when
task switching or performing other common operations.

这是文档的完整链接
https://developer.android.com/training/articles/memory.html

UPDATE

在使用out of memory errors进行令人发指的工作后,我会说将其添加到清单中以避免oom问题不是问题,就像@Milad指出的那样,它不会影响应用程序的正常工作

UPDATE 2

以下是应对out of memory errors的一些技巧

1)使用android提供的onLowMemoryonTrimMemory(int)这些回调并清除图像的缓存(如毕加索,滑行,壁画...),您可以在此处和此处了解有关它们的更多信息
2)压缩文件(图片,pdf)
3)在此处了解如何更有效地处理位图
4)在生产前必须定期使用皮棉,以确保代码流畅且
不笨重


我认为这是一个非常有效的问题,让我添加一些有关使用此选项的优点和缺点的详细信息。

你得到什么 :

  • 显然,您获得了更大的堆,这意味着降低了OutOfMemoryError的风险。

你输了什么:

  • 您可能会丢失一些帧,这可能会导致可见的挂钩。较大的堆会使垃圾回收花费更长的时间。因为垃圾收集器基本上必须遍历整个活动对象集。通常,垃圾回收的暂停时间约为5毫秒,您可能会认为几毫秒不是什么大问题。但是每毫秒都会计数。 Android设备必须每16毫秒更新一次屏幕,更长的GC时间可能会使您的帧处理时间超过16毫秒,这可能会导致可见的跳动。

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

结论:

尽可能避免使用largeHeap选项。这可能会导致您难以注意到的性能下降和糟糕的用户体验。


I have an App with almost 50 classes

我认为这不会造成太大问题。您出现OutOfMemory错误的原因通常是加载到应用程序中的大量图像或类似内容。如果你不快乐使用一大堆,你必须找到一种方法,使用内存优化。

您还可以使用图像加载库,例如Picasso,UIL或Glide。它们都具有在内存和/或磁盘中缓存图像的功能。


实际上android:largeHeap是增加分配给应用程序的内存的工具。

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


如果必须使用(并保留)大量内存,那么可以,并且可以使用android:largeHeap="true"。但是,如果您确实使用过它,则应该准备在其他应用程序出现在前台时从内存中清除您的应用程序。

所谓"准备好",是指您应该针对这种可能性进行设计,以便尽可能有效地编写您的onStop()onResume()方法,同时确保所有相关状态的保存和恢复都以某种方式呈现。给用户带来无缝外观。

有三种与该参数相关的方法:maxMemory()getMemoryClass()getLargeMemoryClass()

对于大多数设备,默认情况下maxMemory()表示与getMemoryClass()类似的值,尽管后者以兆字节表示,而前者以字节表示。

使用largeHeap参数时,maxMemory()将增加到设备特定的更高级别,而getMemoryClass()将保持不变。

getMemoryClass()不会限制堆的大小,但是会告诉您,如果您希望您的应用在运行特定设备的范围内舒适且兼容地运行,则应使用堆的数量。

相比之下,maxMemory()确实会限制堆大小,因此您可以通过增加其值来访问其他堆,而largeHeap确实会增加该值。但是,增加的堆数量仍然受到限制,并且该限制将是特定于设备的,这意味着可用于您的应用程序的堆数量将有所不同,具体取决于运行应用程序的设备的资源。因此,使用largeHeap并不是邀请您的应用放弃所有谨慎,并通过无限量自助餐来寻找自己的方式。

通过调用getLargeMemoryClass()方法,使用largeHeap参数,您的应用程序可以确切地发现在特定设备上将提供多少内存。返回的值以兆字节为单位。

这篇较早的文章包括对largeHeap参数的讨论,以及一些示例,这些示例说明了在几种特定的Android设备上使用和不使用它都可以使用多少堆:

在Android中检测应用程序堆大小

我尚未将此参数设置为true部署任何自己的应用程序。但是,我的一个应用程序中有一些内存密集型代码,用于编译一组与优化相关的参数,这些参数仅在开发期间运行。我仅在开发期间添加largeHeap参数,以避免在运行此代码时出现内存不足错误。但是我在部署应用程序之前先删除了参数(和代码)。


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

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