根据设计,Android应用程序在可以使用的堆内存量方面非常有限。旧设备上SDK应用程序的限制只有16MB。这种设计选择通常是有意义的,因为操作系统试图在通常内存非常低的设备上支持多任务处理 - 因此每个任务都有自己的小配给。
内存限制因设备而异。以三星Galaxy S2为例,每个应用程序的介于32MB-64MB之间。此设备具有1GB的RAM,因此单个任务只能使用设备可提供的约5%。
值得一提的是,iOS上的内存策略非常不同。据我所知,iOS应用程序可以使用多少内存没有外部强制限制。您可以根据需要分配,直到系统内存不足。如果你太贪心,其他后台应用程序将被终止。
让我们解决这个问题 - 这不是关于哪种内存策略更好的讨论。
对于某些类型的应用,难以接受Android上的内存限制。图形密集型应用程序(如游戏)需要大量内存来保存位图。即使是Web浏览器也很难在默认限制下实现。
当resource optimization不够时,克服内存限制的标准策略是使用NDK。 Android中的“本机”堆没有人为限制,其行为与iOS上的堆非常相似。使用“本机”堆来保存位图效果很好 - 这实际上是如何在Android 2.3.3及更低版本上保留位图 (尽管JVM仍然限制它们)。
我正在寻找一个NDK + JNI库来保存“本机”堆中的无限位图。它的Java接口应该与stock位图API相同。我不知道为此目的的任何公共项目,并将感谢您的帮助,找到一个。如果您之前已实现此功能并愿意共享您的代码,那么也将不胜感激。
最终评论:请不要讨论将公共图书馆提供给公众的道德问题。
答案 0 :(得分:3)
最近2GB设备的堆限制大约为192MB。需要大量内存的应用程序(例如图像编辑器)可以在应用清单中包含android:largeHeap=true
,以将其提高到更高的限制(目前大约为512MB)。
在极限范围内工作通常是一个坏主意。它在每台设备上根据物理内存量,显示大小以及设备运行时运行时的性能进行校准。请记住,在Android上,您的应用程序并不是唯一存在的应用程序,并且并非所有物理内存都专门为应用程序保留(内核需要大量内容,多帧图形和视频内容的缓冲区等等)
您的应用越大,被杀的可能性就越大。内核非常努力地不杀死前台应用程序,这意味着你将开始挤出后台进程 - 或者让它们进行如此多的分页并重新启动它会开始影响你的游戏性能。
说了这么多,我想你正在寻找this。