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


125

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

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

Answers:


210

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

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

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


NDK看起来很有趣。我可以将其与已经用SDK编写的代码结合使用吗?
cooxie 2012年

3
这完全取决于您拥有的代码。我不是NDK的专家,并且仅了解基础知识。我建议您问这个问题,并在android-ndk Google网上论坛中对您的代码进行描述,或者使用android-ndk标签在SO上发布一个特定于此的新问题。
拉加夫·苏德

我想知道我们是否不能“简单地”使用Unity3D作为该问题的更具体答案(“使用多个3D模型”)……无法迅速找到任何清晰的证据证明统一性是否确实使用了NDK。
cregox

3
largeHeap=trueFTW
Luis Artola

2
android api的开发人员真的很有趣,就像您想要更多的Heap吗?确定要求,它仅适用于有需要的人...同时,每个开发人员都将其添加为应用程序投产时要添加的第一件事:)
AndroidLover

110

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

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

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

  2. 无法保证大堆的大小

  3. 用户将感知到您的大堆请求,因为这将迫使其他应用退出RAM,终止其他应用的进程以释放系统RAM供您的大堆使用

  4. 由于#3的原因,而且我希望它android:largeHeap会被滥用,因此将来可能会放弃对此的支持,或者可能会在安装时向用户发出警告(例如,您需要为此获得特别许可) )

  5. 目前,此功能已被轻松记录


@CommonsWare如果无法使用largeHeap,如何删除以前加载的对象(如图像)?
Jeongbebs

@MiguelRivera:对于图像,理想情况下,请回收它们的内存(请参阅inBitmap上的BitmapOptions)。除此之外,删除对它们的所有引用,最终它们将被垃圾回收。
CommonsWare 2013年

您建议什么决定?
Gennadiy Ryabkin 2014年

@zest:不知道您指的是什么,对不起。
CommonsWare 2014年

2
@Eftekhari:不是直接针对您的应用。拥有更多的内容可能会导致您花费更多的CPU时间来处理这些内容,但是其中的详细信息取决于您对内存的处理方式,而与请求无关android:largeHeap。但是,请求大堆可能会迫使其他应用程序进程比其他情况更早终止,从而可能整体损害用户体验。
CommonsWare,2016年

22

您不能动态增加堆大小。

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

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

这是我对此发表的一些文章:

这是我为之准备的图书馆:


@每个应用程序在Java级别的堆限制和本地堆限制不同吗?即在s5 devcie 128mb java堆限制和本机上的示例可以占用另一个128 mb?
NitZRobotKoder

每个应用程序的堆大小是恒定的(大小取决于硬件和rom),并且所有堆的大小都应该相同。本机内存是真正的设备之一,但由于操作系统使用某些内存,因此它当然也受到限制。
Android开发人员

我的意思是,如果我的应用程序使用本地.so + java android平台+ Java POJO逻辑+ JavaScript。android在每个级别上都有不同的堆大小吗?
NitZRobotKoder


@NitZRobotKoder否。堆大小适用于Java / Kotlin世界,如果使用过多,则可能会出现OOM异常。其余的是本机内存。
Android开发人员


5

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

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

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

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


4
因此,显然,<2.3是可行的,而> 2.3是可行的,但是2.3是搞砸了!
迈克尔

3

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

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


0

Java Heap的增加不公平地吞噬了缺乏的移动资源。有时仅等待垃圾回收器,然后在减少堆空间之后恢复操作就足够了。然后使用此静态方法

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.