【发布时间】: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 等其他包更好。
谢谢。
【问题讨论】:
-
在什么情况下您希望将 100MB+ 的数据传输到另一个系统?
-
在大型分布式系统中。
-
系统的其余部分不是java吗?当您可以使用 SOAP 时,将如此大的数据转换为 JSON 似乎真的很费劲。对象的 RMI 或序列化可能会更好
标签: java json memory serialization out-of-memory