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

时间:2012-06-30 16:18:29

标签: android

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

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

7 个答案:

答案 0 :(得分:203)

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

尽可能增加限制的唯一方法是通过NDK执行内存密集型任务,因为NDK不会像SDK一样强加内存限制。

或者,您只能加载当前在视图中的模型部分,并根据需要加载其余部分,同时从内存中删除未使用的部分。但是,这可能无法实现,具体取决于您的应用程序。

答案 1 :(得分:109)

  

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

在API Level 11+上运行的应用程序可以在清单中的android:largeHeap="true"元素上使用<application>来请求大于正常的堆大小,getLargeMemoryClass()ActivityManager上会告诉你那堆有多大。但是:

  1. 这仅适用于API级别11+(即Honeycomb及以上)

  2. 无法保证大堆的大小

  3. 用户会感知到您的大堆请求,因为它会强制其他应用程序退出RAM 终止其他应用程序的进程以释放系统RAM以供大堆使用< / p>

  4. 由于#3,以及我希望android:largeHeap会被滥用的事实,将来可能会放弃对此的支持,或者可能会在安装时向用户发出警告(例如,您需要申请特殊许可)

  5. 目前,此功能的记录很少

答案 2 :(得分:21)

您无法动态增加堆大小。

您可以在清单中使用android:largeHeap="true"请求使用更多内容。

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

这里有一些关于它的帖子:

这是我为它制作的图书馆:

答案 3 :(得分:5)

使用第二个过程。使用

AndroidManifestService声明
android:process=":second"

BroadcastReceiver

之上的第一个和第二个流程之间进行交换

答案 4 :(得分:4)

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

  1. 您可以在Android清单的应用程序代码中使用android:largeHeap="true"来请求更大的堆大小,但这不适用于任何预装的Honeycomb设备。
  2. 在2.3之前的设备上,您可以使用 VMRuntime类,但这不适用于Gingerbread及以上版本。请参阅下面的操作方法。
  3. VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);
    

    在设置HeapSize之前,请确保您输入的大小不会影响其他应用程序或操作系统功能。在设置之前,请检查您的应用需要多大的尺寸&amp;然后设置大小只是为了完成你的工作。不要使用这么多内存,否则其他应用程序可能会影响。

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

答案 5 :(得分:3)

据我所知,你可以在早期的Android版本中使用VMRuntime课程,但现在你已经不能再使用了。{/ p>

我不认为让开发人员在移动环境中选择堆大小可以被认为是安全的。我认为通过尝试从应用程序本身修改它,可以更容易地找到修改特定设备(而不是编程方面)的堆大小的方法。

答案 6 :(得分:0)

增加Java堆不公平地吃掉赤字移动资源。有时仅等待垃圾收集器就足够了,然后在堆空间减少后恢复操作。然后使用此static method