我正在使用PoolingClientConnectionManager,我怀疑我正在泄漏连接。我有一个监控线程,可以打印出池统计信息,如下所示:
[leased: 126; pending: 0; available: 14; max: 140]
..
[leased: 140; pending: 20; available: 0; max: 140]
..
[leased: 140; pending: 10; available: 0; max: 140]
我生成的线程数与池连接数 (140) 相同,所以我从没想到租用 + 挂起>最大值。这个假设有效吗?或者这是经理保持联系的情况?我不确定这种情况的连接是否归因于"租赁"或"可用"。
我注意到的是,如果在 DNS 解析期间 HttpClient 连接中断,则可能会发生连接泄漏。在这种情况下,租用的连接不会释放回池。是否有建议的方法来取消分配适当的资源,以便将连接正确释放回池中?
提前谢谢。
是的,似乎确实存在连接泄漏。不过,DNS查找不太可能导致它。HttpClient应该在发生I/O,协议或运行时异常时自动释放连接。
就资源分配而言,规则应该相当简单:只要存在与响应关联的实体,就必须确保其内容被完全消费。HttpClient 4.2 和 HttpClient 4.3 还为特殊情况下的资源释放提供了额外的保护措施:4.2 中的HttpUriRequest#releaseConnection
和 4.3 中的 CloseableHttpResponse#close
还可以尝试在启用连接管理上下文日志记录的情况下运行应用程序,如此处所述,看看这是否可以帮助您跟踪永远不会释放基础连接的请求。