【问题标题】:Serialize large Java Object to Json Strings将大型 Java 对象序列化为 Json 字符串
【发布时间】:2017-04-27 04:47:10
【问题描述】:

我有一个需要序列化为 Json 字符串的大型 Java 对象 (100MB+)。我一直在使用jackson Json,直到我发现它达到了大对象的内存限制:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOfRange(Arrays.java:3664)
    at java.lang.String.<init>(String.java:207)
    at java.lang.StringBuilder.toString(StringBuilder.java:407)
    at com.fasterxml.jackson.core.util.TextBuffer.contentsAsString(TextBuffer.java:349)
    at com.fasterxml.jackson.core.io.SegmentedStringWriter.getAndClear(SegmentedStringWriter.java:83)
    at com.fasterxml.jackson.databind.ObjectWriter.writeValueAsString(ObjectWriter.java:682)
    at JavaTest.objToJson(JavaTest.java:76)

进行转换的方法如下所示:

public static String objToJson(Object obj) {

    ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
    String json = null;

    try {
        json = ow.writeValueAsString(obj);
    } catch (JsonProcessingException e) {
        System.out.println("Error in objToJson(): " + e);
        e.getMessage();
        e.printStackTrace();
    }
    return json;
}

环境是内存密集型,所以我无法随意增加堆大小。

关于序列化 Java 对象的内存效率更高的方法有什么建议吗?我发现 jackson 库可以进行流式传输,但许多帖子都说相反,即将 json 字符串反序列化为对象。另外,jackson lib 的性能似乎比我没有亲自尝试过的 gson 等其他包更好。

谢谢。

【问题讨论】:

标签: java json memory serialization out-of-memory


【解决方案1】:

This answer 包含使用 Jackson Streaming API 的有用提示。更多 Google 搜索显示有用的 examples herehere

对于内存消耗,我创建了一个简单的程序,在内存对象中生成约 33MB 的内存对象,粗略估计如下:

  • 在问题中使用标准 json 转换,最多使用 ~150MB 内存
  • 使用 jackson 流 API,最多使用 ~60MB

但是,我确实需要手动创建 JsonGenerator,它高度依赖于对象结构并且不可扩展;同样对于复杂的对象,创建 JsonGenerator 也不是很容易。

【讨论】:

    猜你喜欢
    • 2019-02-09
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2011-12-31
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多