欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Failed to allocate a 38189038 byte allocation with 16777216 free bytes and 20MB until OOM

程序员文章站 2022-04-26 22:31:49
...

在项目中将图片以base64格式上传,发现当上传的图片大于10张时,app直接崩溃了,出错log如下:

Failed to allocate a 38189038 byte allocation with 16777216 free bytes and 20MB until OOM

定位到出错代码发现是封装的网络底层出现了问题,代码如下:

Failed to allocate a 38189038 byte allocation with 16777216 free bytes and 20MB until OOM
出错log显示340行有问题,我看了半天也没发现有什么问题,最后在https://*.com/questions/32919833/jsonobject-tostring-returns-outofmemoryerror找到了答案,原来是因为json数据太大了,超出了系统分配给应用的内存,从而导致了oom,解决方案也很简单,在manifest.xml中添加一个属性:

android:largeHeap="true"

添加这个属性之后,经测试没问题了.


android:largeHeapde的作用:

为了让应用能申请使用更多的内存,我们知道安卓系统对于每个应用都有内存使用的限制,机器的内存限制,

dalvik.vm.heapsize=128m    
dalvik.vm.heapgrowthlimit=64m    

这里heapgrowthlimit就是一个普通应用的内存限制,用ActivityManager.getLargeMemoryClass()获得的值就是这个。而heapsize是在manifest中设置了largeHeap=true之后,可以使用最大内存值。设置largeHeap的确可以增加内存的申请量。但不是系统有多少内存就可以申请多少,而是由dalvik.vm.heapsize限制。

相关标签: oom largeHeap