在调整大位图的大小以便更快地将图像上传到服务器时,我偶尔会遇到OutOfMemoryErrors。 为了防止这种情况,我计算了所需的内存量,并在尝试缩放图像之前检查它是否超过Runtime.getRuntime()。maxMemory()。
但是,即使图像应该很容易放在堆上,我仍会遇到OOM错误。
仿真设备(Galaxy SII API 16)使用上述方法为我提供了67108864字节的最大内存。
在以下代码段中,堆大小为43975K且仅<&lt; 15K的内存正在使用中。对于我的~31K分配,堆应该自动增长到大约45K,这仍然不接近64 MiB的最大大小。 但正如您所看到的,dalvik vm不会扩展堆,而是耗尽内存。
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()吗? JavaDoc for Runtime.getRuntime()。freeMemory()表示它“可能”扩展,无论这意味着什么。
我只需要一种可靠的方法来计算我可以使用的内存量,这就是我做的方式,如果我错了请纠正我:
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);
答案 0 :(得分:5)
31961100字节分配时内存不足
您的位图是32M。 VM无法分配32M线性空间来存储位图。堆是碎片的,所以即使你的堆有32M的可用空间,也不总是可以分配这样的线性空间。您可以尝试释放尽可能多的内存,并在解码流之前调用GC。
尝试在更多effective way中解码您的位图。 Or process image in parts。 如果您告诉我们您需要此图片的原因,我们可以告诉您如何处理它。
答案 1 :(得分:1)
你有一个42MB的堆,其中已经使用了14MB,67%(28M)是免费/可用的
D/dalvikvm(1201): GC_BEFORE_OOM freed 2K, 67% free 14689K/43975K, paused ...
E/dalvikvm-heap(1201): Out of memory on a 31961100-byte allocation.
您正在尝试分配~31M(不是31K),大于28M可用,从而产生OOM。
有关解释dalvikvm memory allocation log message take a look at debugging memory
的详细信息在android中有很多共享内存使用,以正确计算每个进程的内存使用情况refer this SO question
Android best practices on efficient bitmap memory management可能会有所帮助
答案 2 :(得分:1)
您可能尝试调整的一件事是ROM的build.props
文件。
在Genymotion模拟器上,您可以尝试通过root shell执行以下操作:
cat /system/build.prop | grep dalvik
它将显示带有dalvik设置的行:
dalvik.vm.heapsize=256m
dalvik.vm.lockprof.threshold=500
dalvik.vm.stack-trace-file=/data/anr/traces.txt
在我试验的模拟器上,maxmemory
也被报告为268435456个字节。
因此,您可以尝试使用此设置。另外,请确保VirtualBox设置中分配的内存与这些值兼容。