Java堆空间由org.apache.coyote.http11.Http11AprProtocol填充 Tomcat连接器有问题吗?

问题描述

在生产中,我们有一个Java Web应用程序,该应用程序在Tomcat 9.0.24应用程序服务器中运行。

我们注意到,应用程序随机填充堆空间(6 GB),直到Tomcat因OOM错误而崩溃为止,而这种情况是在没有固定模式的情况下发生的(通常是几天)。

今天,我进行了一次堆转储以研究此主题,并发现了这个单个org.apache.coyote.http11.Http11AprProtocol大对象,该对象当时占已用堆的86%:

enter image description here

在较低的层次上,似乎有几个Http2UpgradeHandler对象也占用了所有这些内存:

enter image description here

将此服务器的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 (将#修改为@)