【发布时间】:2014-10-13 21:31:33
【问题描述】:
在调整大位图的大小以便更快地将图像上传到服务器时,我偶尔会遇到 OutOfMemoryErrors。 为了防止这种情况,我在尝试缩放图像之前计算所需的内存量并检查它是否超过 Runtime.getRuntime().maxMemory()。
但是,即使图像应该可以轻松放入堆中,我仍然会遇到 OOM 错误。
模拟设备(Galaxy SII API 16)使用上述方法为我提供了 67108864 字节的最大内存。
在下面的 sn-p 中,堆大小为 43975K,并且只有
10-13 20:35:57.223: D/dalvikvm(1201): GC_FOR_ALLOC freed 505K, 67% free 14692K/43975K, paused 31ms, total 31ms
10-13 20:35:57.223: I/dalvikvm-heap(1201): Forcing collection of SoftReferences for 31961100-byte allocation
10-13 20:35:57.251: D/dalvikvm(1201): GC_BEFORE_OOM freed 2K, 67% free 14689K/43975K, paused 29ms, total 29ms
10-13 20:35:57.251: E/dalvikvm-heap(1201): Out of memory on a 31961100-byte allocation.
我想知道这是否也可以在真实设备上发生,或者这可能是一个 genymotion 错误。
堆是否保证扩展到 maxMemory()? Runtime.getRuntime().freeMemory() 的 JavaDoc 说它“可能”扩展,无论这意味着什么。
我只需要一个可行的方法来计算我可以使用的内存量,我就是这样做的,如果我错了,请纠正我:
long maxMemory = Runtime.getRuntime().maxMemory();
long usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
long availableMemory = maxMemory - usedMemory;
此调用导致 OutOfMemoryError:
// outOptions has an appropriate inSampleSize
BitmapFactory.decodeStream(inputStream, null, outOptions);
【问题讨论】:
-
这个问题你解决了吗?
-
很遗憾没有。有什么想法吗?
-
不,很抱歉,我仍在处理它。如果我发现有帮助,我会告诉你。
-
你是怎么分配内存的,能贴一下代码sn-p
-
好的,我在编辑的问题中添加了代码sn-p
标签: android genymotion