性能文章>tomcat max-http-header-size 配置问题引发的内存占用过高 #论程序员,你曾遇到关于性能的那些事#>

tomcat max-http-header-size 配置问题引发的内存占用过高 #论程序员,你曾遇到关于性能的那些事#原创

3年前
1029112

某服务在一波上线后内存占用率突然升高。所以对内存做一次排查。
查看堆转储文件:
image.png
发现byte数组3.3%的实例数却占用了35.9%的内存。
分析一下对象,应该是http头的缓冲区;
image.png
解析一下内容:单个大小在4M左右
image.png
看一下tomcat max-http-header-size配置,相吻合。而TOMCAT默认大小为4K,配置是其1000倍。
image.png
此处存在较大OOM风险。

我们根据源码。看一下问题原因:
1、先看下tomcat(版本8.5)中connector基本处理流程: tomcat->connector->protocol->connectionHandler->processor;
image.png

2、从图中来看RequestGroupInfo对象当中存在一个List结构processors,存放RequestInfo信息;
image.png
3、存放RequestInfo中封装了Request信息,Request实例实际由Http11Processor处理;
image.png
4、Http11Processor实际是由Http11NioProtocol创建,对象的方法在其父类AbstractHttp11Protocol中;

5、父类当中存在createProcessor方法,当中取配置的maxHttpHeaderSize作为参数;

image.png

image.png
6、Http11Processor构造方法;
image.png

7、Http11Processor构造方法中的inputBuffer->Http11InputBuffer类的实例;
image.png

8、Http11InputBuffer中存在初始化方法,其中分配了ByteBuffer的大小;
image.png
image.png
至此可确定上图中单个请求占据4M内存的原因所在~

本文正在参与「论程序员,你曾遇到关于性能的那些事丨 PerfMa技术征文」活动

点赞收藏
分类:标签:
changfeng
请先登录,查看1条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步
2
1