我正在使用Tomcat服务器构建消息服务。我也在使用HTTP2网络协议(+ Nio),并将Tomcat连接器配置为使用该协议。当用很少的用户测试时,我的JVM堆成倍增加。通过使用MAT检查堆转储,可以在向浏览器写入/读取数据时调用很多HTTP2流处理器类。
这些流处理器类使用CharHeap和Byte Heap将数据写入客户端。到此为止一切都很好,但是这些临时对象在流处理器类中继续作为垃圾根保留在Heap中。由于HTTP2连接只会在用户关闭页面后销毁,因此流处理器类对象也将保留,因此用于从浏览器写入数据/向浏览器读取数据的所有对象将继续保留并增加堆内存
我正在使用ubuntu OS,tomcat v9.0.14,java v9。
MAT可疑报告给了
由“ java.net.URLClassLoader @ 0x6c01e4148”加载的“ org.apache.coyote.http2.Stream”的191个实例占据29,509,752(61.19%)字节。
我的Tomcat连接器配置为
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" > <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
/* Certificate options here*/
</Connector>
使用HTTP2时是否是默认行为?如果是这样,是否有任何技术可以减少堆内存(从HTTP2流处理器中取消引用对象)?还是我看错了方向?