我正在编写一个使用多个3D模型的Android应用程序。这种带纹理的模型会占用大量内存。我发现制造商对应用程序可以使用的堆大小设置了限制。例如我的平板电脑三星Galaxy Tab 8.9 P7310可以占用64MB内存。
有没有办法增加应用程序可以使用的内存大小?
答案 0 :(得分:203)
您可以使用android:largeHeap="true"来请求更大的堆大小,但这不适用于任何预装的Honeycomb设备。在2.3之前的设备上,您可以使用VMRuntime类,但这不适用于Gingerbread及更高版本。
尽可能增加限制的唯一方法是通过NDK执行内存密集型任务,因为NDK不会像SDK一样强加内存限制。
或者,您只能加载当前在视图中的模型部分,并根据需要加载其余部分,同时从内存中删除未使用的部分。但是,这可能无法实现,具体取决于您的应用程序。
答案 1 :(得分:109)
有没有办法增加应用程序可以使用的内存大小?
在API Level 11+上运行的应用程序可以在清单中的android:largeHeap="true"
元素上使用<application>
来请求大于正常的堆大小,getLargeMemoryClass()
在ActivityManager
上会告诉你那堆有多大。但是:
这仅适用于API级别11+(即Honeycomb及以上)
无法保证大堆的大小
用户会感知到您的大堆请求,因为它会强制其他应用程序退出RAM 终止其他应用程序的进程以释放系统RAM以供大堆使用< / p>
由于#3,以及我希望android:largeHeap
会被滥用的事实,将来可能会放弃对此的支持,或者可能会在安装时向用户发出警告(例如,您需要申请特殊许可)
目前,此功能的记录很少
答案 2 :(得分:21)
您无法动态增加堆大小。
您可以在清单中使用android:largeHeap="true"
请求使用更多内容。
另外,您可以使用native memory (NDK & JNI)
,因此实际上绕过了堆大小限制。
这里有一些关于它的帖子:
这是我为它制作的图书馆:
答案 3 :(得分:5)
使用第二个过程。使用
在AndroidManifest
新Service
声明
android:process=":second"
在BroadcastReceiver
答案 4 :(得分:4)
根据您的Android操作系统,这可以通过两种方式完成。
android:largeHeap="true"
来请求更大的堆大小,但这不适用于任何预装的Honeycomb设备。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。