5

根据设计,Android 应用程序可以使用的堆内存量非常有限。SDK 应用程序的限制在旧设备上低至 16MB。这种设计选择通常是有意义的,因为操作系统试图在内存通常非常低的设备上支持多任务处理 - 所以每个任务都有自己的小比例。

内存限制因设备而异。以三星 Galaxy S2 为例,每个应用程序的大小在 32MB-64MB 之间。该设备具有 1GB 的 RAM,因此单个任务只能使用该设备所能提供的大约 5% 的内存。

值得一提的是,iOS 上的内存策略非常不同。据我所知,iOS 应用程序可以使用多少内存没有外部强制限制。您可以根据需要分配尽可能多的内存,直到系统内存不足。如果你太贪心,其他后台应用程序将被终止。

让我们解决这个问题 - 这不是关于哪种内存策略更好的讨论。

对于某些类型的应用程序,Android 的内存限制难以接受。图形密集型应用程序(例如游戏)需要大量内存来保存位图。在默认限制下,即使是 Web 浏览器也应该很难实现。

资源优化还不够时,克服内存限制的标准策略是使用NDK。Android 中的“本机”堆没有人为限制,其行为与 iOS 上的堆非常相似。使用“本机”堆来保存位图效果很好——这实际上是位图在 Android 2.3.3 及更低版本保存的方式(尽管 JVM 仍然人为地限制了它们)。

我正在寻找一个 NDK+JNI 库来在“本机”堆中保存无限位图。它的 Java 接口应该与股票位图 API 相同。我不知道有任何为此目的的公共项目,并感谢您帮助找到一个。如果您之前已实现此功能并愿意分享您的代码,我们也将不胜感激。

最后评论:请不要讨论让公众可以使用这样的图书馆的道德性。

4

1 回答 1

3

最近 2GB 设备的堆限制约为 192MB。需要大量内存的应用程序(例如图像编辑器)可以包含android:largeHeap=true在应用程序清单中以将其增加到更高的限制(目前约为 512MB)。

围绕限制工作通常是一个坏主意。它根据物理内存量、显示大小以及设备在运行大量应用程序时的性能在每台设备上进行校准。请记住,在 Android 上,您的应用程序并不是唯一存在的,并且并非所有物理内存都专门为应用程序保留(很大一部分用于内核,用于多帧图形和视频内容的缓冲区,等等) .

你的应用程序越大,它被杀死的可能性就越大。内核非常努力地不杀死前台应用程序,这意味着您将开始挤出后台进程 - 或导致它们进行如此多的分页和重新启动,从而开始影响您的游戏性能。

说了这么多,我想你正在寻找这个

于 2013-08-07T14:57:47.477 回答