0

在我的 android 应用程序中,我分配了一个大的 int 数组。当我认为应该有足够的内存时,这有时会给我一个 OutOfMemory 错误。这是我得到的一个例子:

// always this value
ActivityManager.some_instance.getMemoryClass() = 128 Mb

// always this value
Runtime.getRuntime().maxMemory()/(1024*1024) = 128 Mb

// example value
Runtime.getRuntime().freeMemory()/(1024*1024) = 81 Mb

// example value, can also be bigger than freeMemory()
arrayLengthToAllocate*4/(1024*1024) = 47 Mb 

需要明确的是,对于最后一个值大于或小于 freeMemory() 的情况,我会收到 OutOfMemory 错误。

为什么我会收到错误消息?执行分配时堆大小没有增加吗?在尝试分配之前应用程序的内存使用量约为 8 Mb,因此这不是问题。

PS。除了使用该应用程序正在执行的操作的 int[] 之外的其他方法是不可能的。

4

3 回答 3

1

一般来说,大多数设备对您可以使用的内存量都有上限。我知道最初将每个应用程序设置为 16MB。我认为这已经增加了,但它仍然是你应该考虑的事情。

您还必须记住,您的应用程序占用空间可能会波动,并且 Android 操作系统必须为其他竞争资源的应用程序提供内存。可能是 Android 将您的应用程序识别为资源消耗者并削减了它的资源。

在内存中存储 47MB 的整数并不能很好地利用应用程序的内存,没有更简单的方法吗?我不明白为什么你需要这么多整数才能如此容易获得。当然,将整数添加到 SQLite 数据库,根据需要读取它们,从而将大部分内存需求从 RAM 移到物理内存上会是更好的方法吗?

当您遇到 OutOfMemory 错误时,通常表明您有点过于贪婪,限制它们的最佳方法是缩减您正在做的事情,找到不同的方法。

于 2012-11-23T17:16:31.647 回答
0

您获得的内存量是系统内存大小。每个应用程序都有一个有限的子集,这取决于一些系统变量。一般来说,它大约为 16 - 32 MB,有时对于平板电脑来说更大一些。

于 2012-11-23T17:16:40.300 回答
0

我发现问题是堆碎片。碎片整理有一些限制,以至于堆中没有足够的空闲连续字节来容纳单个大数组。我将数据重构为一个二维数组,解决了这个问题,因为每一行在堆中都有自己的位置。缺点是从数组中检索数据的速度稍慢。

于 2012-11-25T10:52:49.023 回答