java是使用GSON JsonReader处理大型字段的最佳方法
我要买一个java。lang.OutOfMemoryError:即使使用GSON流,也会占用Java堆空间
{"result":"OK","base64":"JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PC...."}
base64最长可达200Mb。GSON占用的内存远不止此,(3GB)当我尝试将base64存储在变量中时,我得到:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2367)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:535)
at java.lang.StringBuilder.append(StringBuilder.java:204)
at com.google.gson.stream.JsonReader.nextQuotedValue(JsonReader.java:1014)
at com.google.gson.stream.JsonReader.nextString(JsonReader.java:815)
处理此类字段的最佳方法是什么
# 1 楼答案
得到
OutOfMemoryError
的原因是GSONnextString()
返回一个字符串,该字符串在使用StringBuilder
构建非常大的字符串期间聚合。当您面临这样的问题时,您必须处理中间数据,因为没有其他选择。不幸的是,GSON不允许您以任何方式处理大量文本不确定是否可以更改响应负载,但如果不能,则可能需要实现自己的JSON读取器,或者“黑客”现有的
JsonReader
,使其以流式方式工作。下面的示例基于GSON 2.5,大量使用反射,因为JsonReader
非常小心地隐藏其状态EnhancedGson25JsonReader。爪哇
战地间谍。爪哇
MethodSpy。爪哇
HugeJsonReaderDemo。爪哇
下面是一个演示,它使用该方法读取一个巨大的JSON并将其字符串值重定向到另一个文件
我成功地将上面的字段提取到一个文件中。输入文件的长度为544 MB(570 425 371字节),由以下JSON块生成:
{"result":"OK","base64":"
JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PC
×16777216(2^24)"}
结果是(因为我只是将所有字符串重定向到该文件):
OK
JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PC
×16777216(2^24)我认为你面临着一个非常有趣的问题。如果GSON团队能够就可能的API增强提供一些反馈,那就太好了