Spring占用大约3GB的内存将300 mb的有效负载转换为对象。
我要发送给Spring应用程序的POST请求有效负载是300 mb。但是,SpringBoot应用程序application解析器正在讨论大约3gb的内存,以将请求映射到相应的对象。
由于这个问题,我直接读取流,并编写了自定义解析器来解析有效负载并将其映射到对象。
JSON形式的有效负载如下:
{"a": "some value", "b": "this value is around 300 mb string"}为什么Springboot Jackson解析器使用3GB内存将JSON有效负载映射到对象?我没有编写任何自定义代码,我相信SpringBoot内部使用Jackson将JSON映射到对象。
SpringBoot或Jackson解析器是否适合分析300 mb的有效负载?
注释:我的JSON有效负载中只有一个元素约为300 mb.
发布于 2019-09-14 03:50:03
假设JSON是大多数ASCII字符,那么您的有效载荷就是所有1字节字符。Java字符串是UTF-16编码的,因此每个字符是2个字节.
这意味着您的300 mb有效负载是内存中的600 Mb char[]。
由于有效负载主要是JSON字符串文本,因此需要提取该文本,即复制。由于大小未知,很可能会复制到StringBuilder中。这个StringBuilder将有一个600 Mb的char[],然后从它创建一个字符串,这是另一个600 Mb的char[]。
因此,简单地提取b字段的字符串值将消耗3乘以600 Mb。也就是说,1.8GB内存,您甚至还没有开始为您的对象分配内存。
当然,在开始之前,StringBuilder是符合GC条件的,但是在开始创建POJO之前,您仍然消耗了1.2GB的内存。
https://stackoverflow.com/questions/57932235
复制相似问题