使用jackson-mapper解析为json会导致

时间:2015-04-27 16:34:13

标签: java json macos intellij-idea jackson

我想要解析一个大对象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"
}

我看过几篇帖子:post1post2

但我不确定如何在我的情况下使用它。流式传输如何帮助我解决一个大问题? (不是数组)。

1 个答案:

答案 0 :(得分:1)

这里的主要问题是为什么你想要java.lang.String?通常,您宁愿将内容写入流或文件。

如果你真的希望将整个JSON序列化作为一个字符串,那么Streaming将无法帮助你 - String对象占用大量内存;至少是文件所需内容的2倍。

实际上它不止于此:在构造String的时候,缓冲版本(在char[] sergments中)占用了相同的空间,因此它大约相当于File的4倍。 你的堆也分为不同的区域(年轻,老一代),所以我猜在最坏的情况下你可能需要大约10倍的内存。 如果是这样,设置1024兆应该可以让你处理大约100兆字节的JSON内容。

我会试着弄清楚如何避免首先创建一个大字符串,然后问题应该是可以解决的。