【问题标题】:Tomcat 9 memory leak with PoolingHttpClientConnectionManager and NioEndpointTomcat 9 内存泄漏与 PoolingHttpClientConnectionManager 和 NioEndpoint
【发布时间】:2022-01-13 23:17:12
【问题描述】:
我正在尝试在 kubernetes pod 中分析我的系统中的 cpu 和内存峰值。运行负载测试后,当内存使用率没有下降时,我进行了堆转储并使用 MAT 进行分析。
我是这个代码库的新手。据我所知,它使用 PoolingHttpClientConnectionManager,它使用 NioEndpoint 建立连接池。使用 FeignClient,后者又使用 ApacheHttpClient,后者使用 HttpClient 和连接管理器设置。我看到线程正在堆积,我不知道为什么。非常感谢您提供任何帮助。
【问题讨论】:
标签:
multithreading
tomcat
threadpool
tomcat9
apache-httpclient-5.x
【解决方案1】:
PoolingHttpClientConnectionManager(来自Apache HttpComponents)不使用NioEndpoint(来自Tomcat),它只能用于传入连接(HTTP 服务器套接字)。
您观察到的 500 个 SecureNioChannel 实例是一个缓冲区池,可同时为多达 500 个 TLS 连接提供服务。它们不是泄漏,而是一种减少处理请求所需的垃圾收集量的功能。
您可以通过几个连接器选项来控制这个池(参见documentation):
-
socket.bufferPool 配置池的大小。如果设置为0,则不会创建缓存(但每个请求都会创建一个新的SecureNioChannel对象),
-
socket.appReadBufSize 和 socket.appWriteBufSize 配置每个缓冲区的大小。 SecureNioChannel 使用每种类型的两个缓冲区。