我从HttpUrlConnection
对象获得输入流。 http响应是一个JSON格式的网页,其大小大于50 Mb。
通过将此输入流转换为字符串变量,我的应用最终以致命错误OutOfMemoryError: Failed to allocate a 51096576 byte allocation with 25165824 free bytes and 47MB until OOM, max allowed footprint 244303608, growth limit 268435456
崩溃而告终。
看来,该应用程序无法为此字符串分配所需的内存。
有没有办法预料到OOM
异常? (例如,当输入流几乎耗尽了所有堆时。至少,当这种情况发生时,我可以更改应用程序的行为)
最佳答案
有没有办法预料到OOM异常?
不,对不起
比如说,当inputStream几乎耗尽了所有堆时
这不是OutOfMemoryException
的原因。当您尝试分配内存块并且没有足够大的可用内存块来满足您的请求时,您会得到一个OutOfMemoryException
。
就您而言,您有足够的可用堆空间。您要分配一个很大的块。
通过将此输入流转换为字符串变量
那就是你困难的根源。使用流JSON解析器(Jackson和Gson都具有流模式IIRC),并以小块形式使用JSON。
关于android - 有没有办法预见和防止OOM异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57273331/