设置largeHeap为true的好处是什么?
我有一个近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>
请build议使用它的优点和缺点。
我遇到内存问题,这就是为什么我问这个问题。
这里的派对太晚了,但我会提供0.02美元。
这不是一个好主意,使用 android:largeHeap="true"
这是从谷歌提取解释它,
但是,请求大堆的function仅适用于一小组可以certificate需要消耗更多RAM的应用程序(如大型照片编辑应用程序)。 永远不要因为内存不足而请求一个大的堆,而只需要知道所有内存在哪里被分配,以及为什么必须保留这些内存,就应该使用它。 然而,即使你确信你的应用程序可以certificate这个大堆,你应该尽可能避免要求它。 使用额外内存将越来越不利于整体用户体验,因为垃圾收集将花费更长时间,并且在任务切换或执行其他常见操作时,系统性能可能会变慢。
这里是文档https://developer.android.com/training/articles/memory.html的完整链接;
UPDATE
工作之后与out of memory errors
我会说增加这个清单,以避免OOM问题是不是一个罪过,也像@米拉德指出,它不影响正常工作的应用程序
更新2
以下是一些处理 out of memory errors
提示
1)使用这些callback,android给onLowMemory
, onTrimMemory(int)
和清除像(毕加索,滑翔,壁画….)的图像caching,你可以阅读更多关于他们在这里和这里
2)压缩你的文件(图片,pdf)
3)阅读有关如何在这里更有效地处理位图
4)在生产推动前定期使用棉绒,以确保代码圆滑而不笨重
我认为这是一个非常有效的问题,让我补充一些关于使用这个选项的优点和缺点的细节。
你得到什么 :
- 显然,你会得到更大的堆,这意味着降低
OutOfMemoryError
风险。
你失去了什么:
-
您可能会丢失一些框架,这可能导致可见的挂钩 。 较大的堆使垃圾收集需要更长的时间。 因为垃圾收集器基本上必须遍历整个活的一组对象。 通常情况下,垃圾收集暂停时间约为5ms,你可能会认为几毫秒不是什么大事。 但每一毫秒都算。 Android设备必须每隔16 ms更新其屏幕,并且更长的GC时间可能会将帧处理时间推到16毫秒的屏障上,这会导致可见的挂接。
-
另外切换应用程序将变得更慢 。 Android系统可能会从最近使用的进程开始,终止LRUcaching中的进程,但是也会考虑哪些进程的内存密集度最高。 所以如果你使用的是较大的堆,那么你的进程就更有可能在后台运行时被杀死,这意味着当用户想要从其他应用切换到你的时候可能需要更长的时间。 另外,当你的程序处于前台时,其他的后台进程将更有可能被踢出,因为你的应用程序需要更大的内存。 这意味着从您的应用切换到其他应用也需要更长的时间。
结论:
尽可能避免使用largeHeap
选项。 这可能会使您难以注意到性能下降和糟糕的用户体验。
其实android:largeHeap是增加你的分配内存的应用程序的工具。
没有明确的定义需要使用这个标志。 如果你需要更多的内存 – Android提供了一个工具来增加它。 但是使用的必要性,你自己定义。
我有一个近50个class的应用程序
我不认为这会造成太大的问题。 你出了内存错误的原因通常是加载到应用程序中的许多图像或类似的东西。 如果你不喜欢使用大堆,你必须find一种方法来优化使用内存。
您也可以使用图像加载库,例如毕加索 , UIL或Glide 。 它们都具有在内存和/或磁盘上进行图像caching的function。
无论你的应用程序的进程是否应该用一个大的Dalvik堆来创build。 这适用于为应用程序创build的所有进程。 它仅适用于加载到进程中的第一个应用程序; 如果您使用共享用户标识来允许多个应用程序使用某个进程,则他们都必须始终使用此选项,否则将会产生不可预知的结果。
大多数应用程序不应该需要这个,而应该专注于减less整体内存使用量,以提高性能。 启用此function也不能保证可用内存的固定增加,因为某些设备受到其可用内存总量的限制。