在SpringBoot项目中,我们可以通过如下配置来设置header的大小:

server.max-http-header-size=102400

但如果此参数设置不好,便会引来OOM等相关问题,特别是并发的时候。

max-http-header-size使用场景

该参数用来设置http请求头的大小,默认值为8k,也就是8 * 1024的大小。

那么,什么时候会配置max-http-header-size参数呢?

比如,当我们上传图片时采用multipart形式上传文件时,对应的配置如下:

spring.http.multipart.max-file-size=20Mb  
spring.http.multipart.max-request-size=60Mb 

但这个配置针对base64形式上传图片就不适用了,需要如下配置:

server.maxHttpHeaderSize=102400
server.maxHttpPostSize =102400

但这样的配置就很容易造成OOM。

造成OOM的原因

之所以该参数配置过大,在并发的时候会造成OOM是因为Http请求时内存分配的问题。

比如将max-http-header-size的大小配置为100M,那么并发量100时,那么内存分配就是100* 100,将近1G。

翻看源码会发现,该参数会被用于ByteBuffer.allocate的调用,ByteBuffer.allocate就是生成一个指定长度的字节数组,也就是说这个bufLength有多大,这个字节数组就有多长,而bufLength又是headerBufferSize加上了某个值。如果headerBufferSize=102400000,那么这个地方就会生成一个至少102400000长度的字节数组,这非常消耗内存。

//这里将会有至少102400000个0
byteBuffer = [0,0,0,0,0,0,0,0....,0];

同时大对象会被直接放入老年代,引发full GC等。

所以当并发量比较大时,会迅速消耗掉内存,甚至造成OOM。



springboot max-http-header-size配置及内存溢出问题插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://choupangxia.com/2021/06/09/springboot-max-http-header-size-configure/