128

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

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

4

7 回答 7

212

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

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

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

于 2012-06-30T16:27:29.840 回答
111

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

在 API Level 11+ 上运行的应用程序可以在清单中android:largeHeap="true"<application>元素上请求比正常更大的堆大小,并且getLargeMemoryClass()ActivityManager告诉您该堆有多大。然而:

  1. 这仅适用于 API 级别 11+(即 Honeycomb 及更高版本)

  2. 无法保证大堆有多大

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

  4. 由于#3,以及我预计android:largeHeap会被滥用的事实,将来可能会放弃对此的支持,或者可能会在安装时警告用户(例如,您需要为此请求特殊权限)

  5. 目前,此功能的文档很少

于 2012-06-30T16:25:37.760 回答
23

您不能动态增加堆大小。

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

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

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

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

于 2013-10-16T17:07:15.997 回答
7

使用第二个过程。AndroidManifest用新Service的声明

android:process=":second"

第一和第二进程之间的交换结束BroadcastReceiver

于 2014-03-08T14:26:11.933 回答
5

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

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

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

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

于 2013-11-26T11:14:51.310 回答
3

据我所知,您可以VMRuntime在早期的 Android 版本中使用类,但现在您不能再使用了。

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

于 2012-06-30T16:22:33.633 回答
0

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

于 2017-06-20T06:10:34.313 回答