Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 堆未在Genymotion emulator上展开_Android_Genymotion - Fatal编程技术网

Android 堆未在Genymotion emulator上展开

Android 堆未在Genymotion emulator上展开,android,genymotion,Android,Genymotion,在调整大型位图的大小以便更快地将图像上传到服务器时,我偶尔会遇到内存不足的错误。 为了防止出现这种情况,我计算了所需的内存量,并在尝试缩放图像之前检查它是否超过Runtime.getRuntime().maxMemory() 然而,我仍然会遇到OOM错误,即使映像应该可以很容易地放入堆中 模拟设备(Galaxy SII API 16)使用上述方法为我提供了67108864字节的最大内存 在下面的代码段中,堆大小是43975K,并且只有1的位图。在部分中处理图像可能也不是一个选项-即使我可以将其保

在调整大型位图的大小以便更快地将图像上传到服务器时,我偶尔会遇到内存不足的错误。 为了防止出现这种情况,我计算了所需的内存量,并在尝试缩放图像之前检查它是否超过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.
我想知道这是否也会发生在真正的设备上,或者这可能是genymotion错误

堆是否保证扩展到maxMemory()?JavaDoc for Runtime.getRuntime().freemory()表示它“可能”扩展,不管这意味着什么

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

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);

您有一个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

有关口译的详细信息

android中存在大量的共享内存使用情况,以便正确计算每个进程的内存使用情况


Android可能会有所帮助

您可以尝试调整的一件事是ROM的
build.props
文件

在Genymotion emulator上,您可以尝试通过根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设置中分配的内存与这些值兼容

31961100字节分配的内存不足

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

尝试以更多方式解码位图。
如果您告诉我们为什么需要此图像,我们可以告诉您如何处理。

您解决了此问题吗?不幸的是,没有。有什么想法吗?没有,对不起,我还在处理。如果我发现有什么有用的东西,我会告诉你的。你是如何分配内存的,你能发布代码片段吗?好的,我在编辑过的问题中添加了一个代码片段42MB是堆的当前大小,Runtime.getRuntime().maxMemory()给了我64兆字节。我的印象是,我最多可以使用64兆字节,堆将扩展到这个大小。StackOverflow post很有趣,但它并没有真正回答如何可靠地计算我可以安全分配多少内存的问题。我已经在解码inSampleSize>1的位图。在部分中处理图像可能也不是一个选项-即使我可以将其保存在部分中,我希望在将其缝合回一起时会出现瑕疵(如果我错了,请纠正我)。我目前所做的是在上传到服务器之前将图像的最大边长缩小到1920px。有没有办法找到可分配的最大连续空间?没有。检查这个答案:您也可以创建单独的进程来缩放图像,它只有在图像处理时才具有相同的堆大小。尝试在清单中启用userLargeHeap选项。或者使用流上传原始图像并在服务器端进行缩放。这很不幸,也许我会尝试创建另一个进程。在这种情况下,捕获OutOfMemoryError并直接上载文件是否安全?最好不要捕获OutOfMemoryError并尝试恢复。谷歌它,有很多解释。我认为重用位图没有任何缺陷。但请记住,单独的过程并不能100%保证它能适合您的图像。实际上,我并不太关心模拟器。我只是想知道是否同样的事情也会发生在真实用户的设备上,这会很糟糕。