我从 HttpUrlConnection
对象获取输入流。 http 响应是一个 JSON 格式的网页,其大小大于 50 Mb。
通过将此输入流放入字符串变量中,我的应用程序最终因致命异常而崩溃 OutOfMemoryError:无法分配 51096576 字节分配,其中 25165824 个可用字节和 47MB 直到 OOM,最大允许占用空间 244303608,增长限制 268435456
。
应用程序似乎无法为该字符串分配所需的内存。
有没有办法预测 OOM
异常? (例如,当输入流几乎耗尽所有堆时。至少,当这种情况即将发生时,我可以改变我的应用程序的行为)
最佳答案
Is there a way to anticipate an OOM exception ?
不,对不起。
say for example, when the inputStream will almost eat up all of the heap
这不是 OutOfMemoryException
的原因。当您尝试分配内存块但没有足够大的空闲内存块来满足您的请求时,您会收到 OutOfMemoryException
。
在您的情况下,您有足够的可用堆空间。您要求分配一个巨大的 block 。
By getting this input stream into a string variable
这就是你困难的根源。使用流式 JSON 解析器(Jackson 和 Gson 都具有流式模式 IIRC)并以小块形式使用 JSON。
关于android - 有没有办法预测和防止 OOM 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57273331/