我想要解析一个大对象json Jackson-mapper
。
它工作正常,直到物体变得太大。
我在mac上使用intellij。
代码:
private String serializeToJson(T item) {
String json;
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
try {
json = ow.writeValueAsString(item);
} catch (IOException e) {
e.printStackTrace();
json = "";
}
return json;
}
错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
:BL_generate FAILED
BUILD FAILED
Total time: 12 mins 14.491 secs
at java.util.Arrays.copyOfRange(Arrays.java:3664)
at java.lang.String.<init>(String.java:201)
at java.lang.StringBuilder.toString(StringBuilder.java:407)
at org.codehaus.jackson.util.TextBuffer.contentsAsString(TextBuffer.java:362)
at org.codehaus.jackson.io.SegmentedStringWriter.getAndClear(SegmentedStringWriter.java:100)
at org.codehaus.jackson.map.ObjectWriter.writeValueAsString(ObjectWriter.java:394)
at com.waze.routing.automation.io.string.JsonFileHandler.serializeToJson(JsonFileHandler.java:81)
I'm not sure how to split an object or to write it in parts (append to existing file)
我试图扩大堆空间,但它没有帮助
task BL_generate(type: JavaExec) {
jvmArgs = ["-Xms1024m","-Xmx1024m"]
classpath sourceSets.main.runtimeClasspath
main = "com.m.BaselineGeneratorRunner"
}
但我不确定如何在我的情况下使用它。流式传输如何帮助我解决一个大问题? (不是数组)。
答案 0 :(得分:1)
这里的主要问题是为什么你想要java.lang.String
?通常,您宁愿将内容写入流或文件。
如果你真的希望将整个JSON序列化作为一个字符串,那么Streaming将无法帮助你 - String对象占用大量内存;至少是文件所需内容的2倍。
实际上它不止于此:在构造String的时候,缓冲版本(在char[]
sergments中)占用了相同的空间,因此它大约相当于File的4倍。
你的堆也分为不同的区域(年轻,老一代),所以我猜在最坏的情况下你可能需要大约10倍的内存。
如果是这样,设置1024兆应该可以让你处理大约100兆字节的JSON内容。
我会试着弄清楚如何避免首先创建一个大字符串,然后问题应该是可以解决的。