tomcat max-http-header-size 配置问题引发的内存占用过高 #论程序员,你曾遇到关于性能的那些事#原创
某服务在一波上线后内存占用率突然升高。所以对内存做一次排查。
查看堆转储文件:
发现byte数组3.3%的实例数却占用了35.9%的内存。
分析一下对象,应该是http头的缓冲区;
解析一下内容:单个大小在4M左右
看一下tomcat max-http-header-size配置,相吻合。而TOMCAT默认大小为4K,配置是其1000倍。
此处存在较大OOM风险。
我们根据源码。看一下问题原因:
1、先看下tomcat(版本8.5)中connector基本处理流程: tomcat->connector->protocol->connectionHandler->processor;
2、从图中来看RequestGroupInfo对象当中存在一个List结构processors,存放RequestInfo信息;
3、存放RequestInfo中封装了Request信息,Request实例实际由Http11Processor处理;
4、Http11Processor实际是由Http11NioProtocol创建,对象的方法在其父类AbstractHttp11Protocol中;
5、父类当中存在createProcessor方法,当中取配置的maxHttpHeaderSize作为参数;
6、Http11Processor构造方法;
7、Http11Processor构造方法中的inputBuffer->Http11InputBuffer类的实例;
8、Http11InputBuffer中存在初始化方法,其中分配了ByteBuffer的大小;
至此可确定上图中单个请求占据4M内存的原因所在~
本文正在参与「论程序员,你曾遇到关于性能的那些事丨 PerfMa技术征文」活动