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

时间:2014-12-10 09:02:20

标签: android android-largeheap

我有一个应用程序,其中有近50个类我正在设置android:largeHeap="true",如下所示。这是一个好习惯吗?

<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>

请说明使用它的优点和缺点。

我遇到了记忆问题,这就是我提出这个问题的原因。

6 个答案:

答案 0 :(得分:84)

这里的聚会方式太迟了,但反正我会提供0.02美元 使用 android:largeHeap="true"这不是一个好主意,这里是解释它的谷歌摘录,

  

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

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

  

更新

在与out of memory errors一起工作之后,我会说要将它添加到清单中以避免问题不是罪,也像@Milad指出它不会影响应用程序的正常工作

  

更新2

以下是一些与<{1}}

进行交易的提示

1)使用android提供 out of memory errors onLowMemory 的这些回调,并清除图片缓存(picasso,glide,fresco等)。 ...)您可以阅读有关他们herehere的更多信息 2)压缩文件(图像,pdf)
3)阅读有关如何更有效地处理位图的问题here
4)在生产推动之前定期使用棉绒,以确保代码顺畅    不笨重

答案 1 :(得分:45)

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

获得的内容:

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

你输了什么:

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

  • 同时切换应用也会变慢。 Android系统可以从最近最少使用的进程开始杀死LRU高速缓存中的进程,但也考虑哪些进程占用大多数内存。因此,如果您使用更大的堆,您的进程在后台运行时更有可能被杀死,这意味着当用户想要从其他应用切换到您的应用时可能需要更长的时间。当您的流程处于前台时,其他后台流程也更有可能被淘汰,因为您的应用需要更大的内存。这意味着从您的应用切换到其他应用也需要更长的时间。

结论:

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

答案 2 :(得分:14)

实际上android:largeHeap是增加分配内存到app的工具。

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

答案 3 :(得分:12)

  

我有一个有近50个课程的应用程序

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

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

答案 4 :(得分:3)

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

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

答案 5 :(得分:3)

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

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

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

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

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

getMemoryClass()不会限制您的堆大小,但会告诉您 如果希望您的应用正常运行 和< em>兼容在您正在运行的特定设备的限制内。

相比之下,

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

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

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

Detect application heap size in Android

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