将大型Java对象序列化为Json字符串
我有一个大型Java对象(100MB+)需要序列化为Json字符串。我一直在使用jackson Json,直到我发现它在大型对象上达到内存限制:将大型Java对象序列化为Json字符串,java,json,memory,serialization,out-of-memory,Java,Json,Memory,Serialization,Out Of Memory,我有一个大型Java对象(100MB+)需要序列化为Json字符串。我一直在使用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
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)
环境是内存密集型的,因此我不能随意增加堆大小
关于序列化Java对象的更节省内存的方法有什么建议吗?我发现jackson库可以进行流式处理,但很多帖子都提到了另一种方法,即将json字符串反序列化为对象。另外,jacksonlib似乎比gson等其他软件包有更好的性能,我个人还没有尝试过
谢谢。包含使用Jackson流媒体API的有用提示。更多的谷歌搜索显示了有用和有用的信息
对于内存消耗,我创建了一个简单的程序,生成一个~33MB内存对象,下面是粗略估计:
- 使用问题中的标准json转换,它最多需要150MB内存
- 使用jackson流媒体API,它使用高达60MB的数据
但是,我确实需要手动创建JsonGenerator,它高度依赖于对象结构,不可伸缩;同样对于复杂对象,创建JsonGenerator也不太容易。在什么情况下,您希望将100MB+的数据传输到另一个系统?在大型分布式系统中。检查这是系统的其余部分,而不是java?当您可以使用SOAP时,将如此大的数据转换为JSON似乎非常困难。对象的RMI或序列化可以更好地复制
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;
}