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

Int*_*der 102 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>
Run Code Online (Sandbox Code Playgroud)

请建议使用它的优点和缺点.

我得到记忆问题,这就是我问这个问题的原因.

war*_*ero 99

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

但是,请求大堆的能力仅适用于一小部分可以证明需要消耗更多RAM的应用程序(例如大型照片编辑应用程序).永远不要因为内存不足而需要快速修复而请求大堆 - 只有当您确切知道所有内存的分配位置以及必须保留的原因时才应使用它.然而,即使你确信你的应用程序可以证明大堆的合理性,你应该避免在任何可能的范围内请求它.使用额外的内存将越来越不利于整体用户体验,因为当任务切换或执行其他常见操作时,垃圾收集将花费更长时间并且系统性能可能更慢.

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

UPDATE

out of memory errors我努力工作之后,我会说将这个添加到清单以避免问题不是一个罪,也像@Milad指出下面它不会影响应用程序的正常工作

更新2

这里有一些提示,以应对out of memory errors

1)使用这些回调Android为onLowMemory,onTrimMemory(int) 和清晰的图像缓存像(毕加索,滑翔,户外......),你可以阅读更多关于他们在这里这里
2)压缩文件(图片,PDF)
3)阅读如何处理位图更有效地在这里
4)经常使用前皮棉产量推动,以确保代码是时尚而不是笨重


김준호*_*김준호 53

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

你得到什么 :

  • 显然,你得到更大的堆,这意味着降低风险OutOfMemoryError.

你输了什么:

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

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

结论:

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


Mil*_*nia 14

我有一个近50个班级的应用程序

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

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

  • 滑翔比毕加索更好,更优化 (4认同)

Ser*_*kov 13

实际上android:largeHeap是增加你分配给app的内存的工具.

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

  • 是的,有一个明确的定义,请参阅此链接https://developer.android.com/training/articles/memory.html (3认同)
  • @war_Hero - 也许那篇文章改变了它的内容?其中没有提到largeHeap. (2认同)

Car*_*arl 5

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

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

有三种方法,涉及到这个参数:maxMemory()getMemoryClass(),和getLargeMemoryClass()

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

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

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

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

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

这篇较早的文章讨论了该largeHeap参数,并提供了一些示例,说明了在几个特定的​​Android设备上使用和不使用它时可以使用多少堆:

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

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

  • _“放弃所有谨慎,在无限量自助餐中一路前行”_ (2认同)