问题描述
在生产中,我们有一个Java Web应用程序,该应用程序在Tomcat 9.0.24应用程序服务器中运行。
我们注意到,应用程序随机填充堆空间(6 GB),直到Tomcat因OOM错误而崩溃为止,而这种情况是在没有固定模式的情况下发生的(通常是几天)。
今天,我进行了一次堆转储以研究此主题,并发现了这个单个org.apache.coyote.http11.Http11AprProtocol
大对象,该对象当时占已用堆的86%:
在较低的层次上,似乎有几个Http2UpgradeHandler对象也占用了所有这些内存:
将此服务器的Tomcat配置与用于另一位客户的类似任务的另一台服务器进行比较,我发现“不良”服务器已配置了有关HTTP连接器元素的APR协议,而“未发生故障”一种使用NIO协议。
这是server.xml
文件中的APR连接器设置:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="200" SSLEnabled="true" >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeyFile="****.key"
certificateFile="****.crt"
CACertificateFile="****.crt"
certificateChainFile="****.ca-bundle"
type="RSA" />
</SSLHostConfig>
</Connector>
这是NIO的实现:
<Connector
port="8443" maxThreads="500"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="****" keystorePass="****"
clientAuth="false"
protocol="org.apache.coyote.http11.Http11NioProtocol" />
这是APR连接器的配置错误吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)