我在adb logcat窗口中看到以下内容:
01-24 14:40:56.916: E/dalvikvm-heap(24727): 1957200-byte external allocation too large for this process.
01-24 14:40:56.966: E/GraphicsJNI(24727): VM won't let us allocate 1957200 bytes
01-24 14:40:56.976: E/dalvikvm(24727): OutOfMemory: max: 50331648(49152 K), total: 39985120(39047 K), alloc: 33659240(32870 K), extAlloc: 8993870(8783 K)
我不明白为什么这些数字不加起来(或者我只是不明白这是如何工作的)。我看到OutOfMemory:基本上最多48MB - 我认为这是最大堆大小。不确定这个上下文中的“总数”是什么意思,但它看起来大概是39MB。在2MB的分配上失败了,我真的不明白为什么它会失败,应该有9MB可用......我在这里有什么误解?
答案 0 :(得分:4)
欢迎来到堆碎片的精彩世界。简而言之,您需要一个连续的内存块来满足分配,而不仅仅是足够的空闲字节。
举个例子,假设一个空的1MB堆。现在假设在1MB的中间是1K的分配。即使你有99.9%的空间可用,你也不能分配超过500K的任何东西,因为它必须是连续的。移动1K分配,你可以分配更多,但在病态情况下,你最终可以拥有比你可以分配更多的可用内存。
对于你的情况,我敢打赌,如果你试图进行2000次1K分配,它会很好用。如果您正在处理碎片或其他事情,那会让您知道。