天天看点

使用httpclient时根据 CLOSE_WAIT 和 leased 判断连接处理是否正确 1 CLOSE_WAIT  等待资源释放2 leased 连接池中正在使用的连接数3 问题4 原因5 解决6 分析

1 CLOSE_WAIT  等待资源释放

          对应socket中,客户端就是等待inputStream关闭,服务端就是等待outputStream关闭。 可以通过 netstate 指令获取连接情况。

# netstat -t | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
      CLOSE_WAIT 27
      ESTABLISHED 28
      TIME_WAIT 4865
           

2 leased 连接池中正在使用的连接数

leased 连接池中正在使用的连接数  

available 连接池中可用的连接数  

(leased + available)为创建的总连接数    

pending 存放等待获取连接的线程的Future 

PoolingHttpClientConnectionManager.getTotalStats().toString()
[leased: 23; pending: 0; available: 2; max: 200]
           

3 问题

     程序运行一段时间,TCP等待释放资源的连接数和httpclient中正在使用的连接数不下降,且数目接近。

4 原因

     httpclient未进行资源的释放。

5 解决

     使用 EntityUtils.consume( entity ); 即可释放资源。

6 分析

  EntityUtils.consume( entity ); 源码:

public static void consume(HttpEntity entity) throws IOException {
        if(entity != null) {
            if(entity.isStreaming()) {
                InputStream instream = entity.getContent();
                if(instream != null) {
                    instream.close();
                }
            }

        }
    }
           

通过关闭InputStream,释放TCP资源,同时等待HttpClient中的回收线程对连接进行回收(未标记重用的连接直接关闭)

参考:https://www.cnblogs.com/trust-freedom/p/6349502.html

继续阅读