fastjson2序列化报错OutOfMemoryError

时间:2025-03-21 10:08:48

问题现象及分析

报错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;
    }