我正在编写一个使用多个 3D 模型的 Android 应用程序。这种带有纹理的模型会占用大量内存。我发现制造商对应用程序可以使用的堆大小设置了限制。例如我的平板三星 Galaxy Tab 8.9 P7310 可以占用 64MB 内存。
有没有办法增加应用程序可以使用的内存大小?
我正在编写一个使用多个 3D 模型的 Android 应用程序。这种带有纹理的模型会占用大量内存。我发现制造商对应用程序可以使用的堆大小设置了限制。例如我的平板三星 Galaxy Tab 8.9 P7310 可以占用 64MB 内存。
有没有办法增加应用程序可以使用的内存大小?
您可以使用android:largeHeap="true"请求更大的堆大小,但这不适用于任何预 Honeycomb 设备。在 2.3 之前的设备上,您可以使用 VMRuntime 类,但这不适用于 Gingerbread 及更高版本。
拥有尽可能大的限制的唯一方法是通过 NDK 执行内存密集型任务,因为 NDK 不像 SDK 那样施加内存限制。
或者,您可以仅加载当前视图中的模型部分,并根据需要加载其余部分,同时从内存中删除未使用的部分。但是,这可能是不可能的,具体取决于您的应用程序。
有没有办法增加应用程序可以使用的内存大小?
在 API Level 11+ 上运行的应用程序可以在清单中android:largeHeap="true"
的<application>
元素上请求比正常更大的堆大小,并且getLargeMemoryClass()
会ActivityManager
告诉您该堆有多大。然而:
这仅适用于 API 级别 11+(即 Honeycomb 及更高版本)
无法保证大堆有多大
用户会感知到你的大堆请求,因为它会强制他们的其他应用程序退出 RAM,终止其他应用程序的进程以释放系统 RAM 供你的大堆使用
由于#3,以及我预计android:largeHeap
会被滥用的事实,将来可能会放弃对此的支持,或者可能会在安装时警告用户(例如,您需要为此请求特殊权限)
目前,此功能的文档很少
您不能动态增加堆大小。
您可以通过android:largeHeap="true"
在清单中使用来请求使用更多。
此外,您可以使用native memory (NDK & JNI)
,因此您实际上绕过了堆大小限制。
这里有一些关于它的帖子:
这是我为它制作的图书馆:
使用第二个过程。AndroidManifest
用新Service
的声明
android:process=":second"
第一和第二进程之间的交换结束BroadcastReceiver
这可以根据您的 Android 操作系统通过两种方式完成。
android:largeHeap="true"
在 Android 清单的应用程序标签中使用来请求更大的堆大小,但这不适用于任何预 Honeycomb 设备。VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);
在设置 HeapSize 之前,请确保您已输入适当的大小,不会影响其他应用程序或操作系统的功能。在设置之前,只需检查您的应用程序需要多少大小,然后设置大小以完成您的工作。不要使用太多内存,否则其他应用程序可能会影响。
参考:http ://dwij.co.in/increase-heap-size-of-android-application
据我所知,您可以VMRuntime
在早期的 Android 版本中使用类,但现在您不能再使用了。
我不认为让开发人员在移动环境中选择堆大小可以被认为是安全的。我认为通过尝试从应用程序本身修改堆大小,您可以更容易地找到一种方法来修改特定设备(而不是在编程端)中的堆大小。
增加 Java Heap 不公平地消耗了不足的移动资源。有时只需等待垃圾收集器,然后在堆空间减少后恢复操作就足够了。然后使用这个静态方法。