tomcat静态文件内存溢出


现象

正式环境中没间隔几个星期就会发生一次内存溢出问题。tomcat版本:8.0.43

SEVERE: 
java.lang.OutOfMemoryError: Java heap space

Jul 26, 2019 5:25:39 PM org.apache.tomcat.util.net.NioEndpoint checkParachute
SEVERE: SEVERE:Memory usage is low, parachute is non existent, your system may start failing.
Jul 26, 2019 5:25:39 PM org.apache.tomcat.util.net.NioEndpoint checkParachute
SEVERE: SEVERE:Memory usage is low, parachute is non existent, your system may start failing.
Jul 26, 2019 5:25:45 PM org.apache.tomcat.util.net.NioEndpoint$Acceptor run
SEVERE: 
java.lang.OutOfMemoryError: Java heap space

Jul 26, 2019 5:25:57 PM org.apache.tomcat.util.net.NioEndpoint$Acceptor run
SEVERE: 
java.lang.OutOfMemoryError: Java heap space

Jul 26, 2019 5:26:02 PM org.apache.tomcat.util.net.NioEndpoint checkParachute
SEVERE: SEVERE:Memory usage is low, parachute is non existent, your system may start failing.
Jul 26, 2019 5:26:08 PM org.apache.tomcat.util.net.NioEndpoint$Acceptor run
SEVERE: 
java.lang.OutOfMemoryError: Java heap space


问题定位

查看应用进程号

[user@VM_0_6_centos logs]$ jps
32361 war
21450 Jps
29051 Bootstrap

内存快照导出

jmap -dump:format=b,file=./dump/jmap.hprof 29051

使用mat对快照分析

分析结果


10,735 instances of "org.apache.coyote.RequestInfo", loaded by "java.net.URLClassLoader @ 0xc1044bf8" occupy 1,160,848,488 (91.15%) bytes. These instances are referenced from one instance of "java.lang.Object[]", loaded by "<system class loader>"

Keywords
java.lang.Object[]
org.apache.coyote.RequestInfo
java.net.URLClassLoader @ 0xc1044bf8


Details »

系统中存在大量的RequestInfo对象,点击对象发现请求地址都是tomcat下webapp下面的静态资源文件,而不是web应用的url。

之前为了定位问题开启了tomcat的控制台用来监控状态。

可以看到old gen异常,下面的请求数有1万多个。正好对应上面的requestinfo对象数量。


异常复现:

把整个tomcat复制一份,修改端口后启动,用ab压测了一下:

压测前:

只有一个请求。

压测后:请求数增加为100。

#请求300次,100线程。
ab -n300 -c100 http://ip:port/uploadCwis/images/2018/08/13/2db8d60a-1c83-460c-ab33-c8b1f8abc13f.jpg

第二次压测:

使用相同参数压测:

请求数变为600。

第三次压测:

使用相同参数压测:

请求数变为900。

。。。

每多测一次,请求次数增加,完全不释放或复用。

从官网下载相同版本的tomcat,jvm参数改为一致后进行相同的测试。

发现多测测试后最多请求数不到200。开始怀疑这个tomcat有问题。

使用bcompare对tomcat的jar文件进行对比。

发现lib\tomcat-coyote.jar的AbstractProtocol类有不同的地方。

使用jad反编译后对这个类进行进一步比较

左边是正式环境。右边的是官网版本。

发现两个版本对于AbstractEndpoint.Handler.SocketState.SENDFILE处理有所不同。

正式环境的是使用release(wrapper, processor, true, false);

官网版本使用的是 this.connections.put(socket, processor);

然而对比github上tomcat其他的版本。又有所不同。(这些变更的意义是什么???)

直接使用官网下载的jar替换公司环境,压测后正常。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM