7

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

 3 years ago
source link: https://club.perfma.com/article/2314628
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
tomcat max-http-header-size 配置问题引发的内存占用过高 #论程序员,你曾遇到关于性能的那些事#
文章>tomcat max-http-header-size 配置问题引发的内存占用过高 #论程序员,你曾遇到关于性能的那些事#

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

长风Liux4天前

某服务在一波上线后内存占用率突然升高。所以对内存做一次排查。
查看堆转储文件:
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技术征文」活动

0人觉得很赞
1029 阅读

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK