在我的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 []之外的其他方法是不可能的。
答案 0 :(得分:1)
一般来说,大多数设备都会限制您可以使用的内存量。我知道原来每个应用程序设置为16MB。我认为这已经增加了,但它仍然是你应该考虑的事情。
您还必须记住,您的应用程序占用空间可能会波动,并且Android操作系统必须为其他正在竞争资源的应用程序提供内存。可能是Android正在将您的应用程序识别为资源占用并且正在削减它的资源。
在内存中存储47MB的整数不能很好地利用应用程序的内存,难道没有更简单的方法吗?我不明白为什么你需要这么多整数才能如此容易获得。当然将整数添加到SQLite数据库中,根据需要读取它们,从而将大部分内存需求从RAM迁移到物理内存上会是更好的方法吗?
当您遇到OutOfMemory错误时,通常表明您有点太贪心,限制它们的最佳方法是缩减您正在做的事情,找到不同的方法。
答案 1 :(得分:0)
您获得的内存量是系统内存大小。每个应用程序都有一个有限的子集,这取决于一些系统变量。一般情况下,它的大小约为16 - 32 MB,平板电脑有时会更大一些。
答案 2 :(得分:0)
我发现问题是堆碎片。碎片整理具有限制,使得堆中没有足够的空闲连续字节以适合单个大型数组。我将数据重构为二维数组,解决了问题,因为每一行在堆中都有自己的位置。缺点是从数组中检索数据的速度稍慢。