杰克逊 writeValueAsString 太慢

Jackson writeValueAsString too slow

我想从对象创建 JSON 字符串。

ObjectMapper om = new ObjectMapper();
String str = om.writeValueAsString(obj);

有些对象很大,创建JSON字符串需要很长时间。 要创建 8MB JSON 字符串,大约需要 15 秒。

我该如何改进?

确保您有足够的内存:Java 用于存储 8 MB 序列化 JSON 的字符串在堆中需要大约 16 兆字节的 连续 内存。

但更重要的是:为什么要在内存中创建 java.lang.String? 这么大的String有什么用?

如果您需要将JSON内容写入文件,有不同的方法;类似地写入网络套接字。至少您可以将输出写为 byte[](占用的内存减少 50%),但在大多数情况下,增量写入外部流只需要很少的内存。

15秒肯定很慢。如果没有 GC 问题,在初始预热后,Jackson 应该在几分之一秒内写入 8 兆字节,对于由标准 Java 类型组成的简单对象,大约需要 10-20 毫秒。

编辑:

刚刚发现,在构造结果String的过程中,临时内存的使用也会翻倍,因为在构造String时缓冲的内容还没有被清除。所以 8 MB 至少需要 32 MB 来构造 String。对于 64 MB 的默认堆,这将无法正常工作。