tomcat connector 缓存连接数过多至内存溢出

最新有过一次内存溢出,把heapdump拉下来分析了一下,发现org.apache.coyote.RequestInfo存在上W个实例,再仔细一下都是放在org.apache.coyote.RequestGroupInfo的processors对象中,再进一步查看发现在里面的request不只是html而且js等资源的请求也缓存在里面,于是我断定这问题不是出在应用,应该是TOMCAT连接器上出问题了,于现开始疯狂的百度,贴吧,但好像没有人知道是怎么回事,我也来回不停的端详着内存分析器,怎么也看不出原因,经过几天的折腾,我终于静下心来,跑到APACHE上下了个TOMCAT源码做起了DEBUG,DEBUG直指org.apache.coyote.RequestGroupInfo的addRequestProcessor方法,主要是看是这个方法栈的来龙去脉,终于在Http11Protocol中让我找到了问题,问题的关键就在于processorCache这个变量,tomcat默认是-1,就是说无限制缓存,就是这个导致了上W实例的产生,于是我们只要把这么改成一个固定值就可以了,找到server.xml,再找到相对的连接器,如下
    <Connector port="8080" protocol="org.apache.coyote.http11.Htp11Protocol" 
               processorCache="500"
               connectionTimeout="20000" 
               URIEncoding="UTF-8"/>


如果是AJP的连接器的话,如不想缓存,可做以下设置
request.registerRequests="false"

如是NIO连接:
socket.processorCache="500"

猜你喜欢

转载自wen19851025.iteye.com/blog/2246163
今日推荐