springboot max-http-header-size配置及内存溢出问题
在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。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接
本文链接:https://choupangxia.com/2021/06/09/springboot-max-http-header-size-configure/