堆不在Genymotion模拟器上扩展

wka*_*arl 6 android genymotion

在调整大位图的大小以便更快地将图像上传到服务器时,我偶尔会遇到OutOfMemoryErrors.为了防止这种情况,我计算了所需的内存量,并在尝试缩放图像之前检查它是否超过Runtime.getRuntime().maxMemory().

但是,即使图像应该很容易放在堆上,我仍会遇到OOM错误.

仿真设备(Galaxy SII API 16)使用上述方法为我提供了67108864字节的最大内存.

在下面的代码片段中,堆大小为43975K,并且仅使用该内存的<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.
Run Code Online (Sandbox Code Playgroud)

我想知道这是否会在真实设备上发生,或者这可能是一个genymotion错误.

堆保证扩展到maxMemory()吗?JavaDoc for Runtime.getRuntime().freeMemory()表示它"可能"扩展,无论这意味着什么.

我只需要一种可靠的方法来计算我可以使用的内存量,这就是我的方法,如果我错了请纠正我:

long maxMemory = Runtime.getRuntime().maxMemory();
long usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
long availableMemory = maxMemory - usedMemory;
Run Code Online (Sandbox Code Playgroud)

此调用导致OutOfMemoryError:

// outOptions has an appropriate inSampleSize
BitmapFactory.decodeStream(inputStream, null, outOptions);
Run Code Online (Sandbox Code Playgroud)

Leo*_*dos 5

31961100字节分配的内存不足

你的位图是32M.VM无法分配32M线性空间来存储位图.堆是碎片的,所以即使你的堆有32M的可用空间,也不总是可以分配这样的线性空间.您可以尝试释放尽可能多的内存,并在解码流之前调用GC.

尝试以更有效的方式解码您的位图.或者处理部分图像.如果您告诉我们您需要此图片的原因,我们可以告诉您如何处理它.

  • 不.检查这个答案:http://stackoverflow.com/questions/3331527/android-resize-a-large-bitmap-file-to-scaled-output-file你也可以创建单独的过程来缩放图像,它会有相同的堆大小仅用于图像处理.尝试在清单中启用userLargeHeap选项.或者使用流上传原始图像并在服务器端进行缩放. (2认同)