如何增加android应用程序的堆大小?

我正在编写一个使用多个3D模型的Android应用程序。 这样的纹理模型会占用大量的内存。 我发现制造商对应用程序可以使用的堆大小设置了限制。 例如我的平板电脑三星Galaxy Tab 8.9 P7310可以占用64MB的内存。

有没有办法增加应用程序可以使用的内存大小?

您可以使用android:largeHeap =“true”来请求更大的堆大小,但这不适用于任何以前的Honeycomb设备。 在2.3之前的设备上,可以使用VMRuntime类,但是这不适用于Gingerbread及更高版本。

尽可能限制的唯一方法是通过NDK完成内存密集型任务,因为NDK不会像SDK那样施加内存限制。

或者,您只能加载当前正在查看的部分模型,并根据需要加载其余部分,同时从内存中删除未使用的部分。 但是,这可能是不可能的,这取决于你的应用程序。

有没有办法增加应用程序可以使用的内存大小?

运行在API Level 11+上的<application>在清单中的<application>元素上使用android:largeHeap="true"来请求比正常堆大的大小, ActivityManager上的getLargeMemoryClass()会告诉你堆的大小是多less。 然而:

  1. 这只适用于API Level 11+(即Honeycomb及更高版本)

  2. 无法保证大堆会有多大

  3. 用户会感觉到你的大堆请求,因为它会迫使他们的其他应用程序离开内存终止其他应用程序的进程释放系统RAM供大堆使用

  4. 因为#3,而且我期望android:largeHeap会被滥用,将来可能会放弃对此的支持,或者在安装时可能会提醒用户(例如,您将需要特殊的许可)

  5. 目前,这个function很lesslogging

您不能dynamic增加堆大小。

您可以通过在清单中使用android:largeHeap="true"来请求更多的使用。

另外,你可以使用native memory (NDK & JNI) ,所以你实际上绕过了堆大小的限制。

这里是我已经提出的一些post:

  • 如何将位图caching到本机内存

  • JNI位图操作,帮助避免使用大图像时的OOM

这里是我为之制作的一个图书馆:

使用第二个过程。 在AndroidManifestService声明

 android:process=":second" 

通过BroadcastReceiver交换第一个和第二个进程

从我记得你可以在早期的Android版本使用VMRuntime类,但现在你不能再。

我不认为让开发人员在移动环境中select堆大小可以被认为是很安全的。 我认为,通过尝试从应用程序本身进行修改,您可以更轻松地find修改特定设备(而不是编程端)的堆大小的方法。

根据你的Android操作系统,这可以通过两种方式完成。

  1. 您可以在Android清单的应用程序标记中使用android:largeHeap="true"来请求更大的堆大小,但是这对于任何预先蜂窝设备不起作用。
  2. 在2.3之前的设备上,你可以使用VMRuntime类 ,但是这对于姜饼和以上的程序是无效的。
 VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE); 

在设置HeapSize之前,请确保您input的大小不会影响其他应用程序或操作系统function。 设置之前,只需检查您的应用程序需要多less大小,然后设置大小才能完成您的工作。 不要使用太多的内存,否则其他应用程序可能会影响。

参考: http : //dwij.co.in/increase-heap-size-of-android-application

增加Java堆不公平地消耗赤字移动resurces。 有时只需等待垃圾收集器 ,然后在减less堆空间后恢复操作就足够了。 然后使用这个静态方法 。