问题现象及分析
报错log如下,这里用的是阿里的.fastjson2 2.0.9版本,该版限制了最大可以序列化大小是64M,超过了就报错OutOfMemoryError
Exception in thread "pool-4-thread-1"
at .fastjson2.(:561)
at .(:143)
at ..ObjectWriter_3.write(Unknown Source)
at .(:278)
at .(:1757)
at .(:35)
at (:128)
at (:323)
at (:71)
at $exportPayDetail$2(:184)
at (:59)
at (:1149)
at $(:624)
at (:748)
解决办法
要想解决,只能升级jar的版本,参考/alibaba/fastjson2/issues/841.
我这里是升级到2.0.16(考虑到升级版本和现有代码的兼容性,没有用最新的),在序列化时增加一个features(features可以传多个的,根据自己需要传):
JSON.toJSONString(t, JSONWriter.Feature.WriteClassName, JSONWriter.Feature.LargeObject).getBytes(DEFAULT_CHARSET);
这样最大序列化对象即可以支持1G了。见以下源码:
protected JSONWriter(Context context, Charset charset) {
this.context = context;
this.charset = charset;
this.utf8 = charset == StandardCharsets.UTF_8;
this.utf16 = charset == StandardCharsets.UTF_16;
quote = (context.features & Feature.UseSingleQuotes.mask) == 0 ? '"' : '\'';
// 64M or 1G
maxArraySize = (context.features & LargeObject.mask) != 0 ? 1073741824 : 67108864;
}