HttpClient的释放资源到底在释放什么?如何正确的释放资源? | 您所在的位置:网站首页 › java中资源泄露sc永远不会关闭什么意思 › HttpClient的释放资源到底在释放什么?如何正确的释放资源? |
HttpRequestBase对象的releaseConnection跟abort方法,HttpGet、HttpPost都继承了这个类。 源码如下: 这两个方法最终都会调用cancellableRef引用的对象的cancel方法,cancellableRef在不同的时机对应不同的资源对象:ConnectionRequest,代表一个从连接池中获取连接的请求。ConnectionHolder,代表一个真实的http连接 代码位于:org.apache.http.impl.execchain.MainClientExec#execute 当调用ConnectionRequest的cancel方法时,代表取消本次获取连接的请求。当调用ConnectionHolder的cancel方法时,代表什么呢?代码如下:org.apache.http.impl.execchain.ConnectionHolder#abortConnection 上面代码主要做了两件事:关闭socket连接,归还连接到连接池。可能有的小伙伴会有疑问,为什么把连接绑定的socket关闭了还要将连接归还到连接池呢?这是因为连接池中的连接数量是有限制的,假设我们设置设置了最大连接数为10,如果不把这个连接归还到连接池,那么它会一直占用一个连接名额直到被驱逐策略所驱逐。并且在调用连接池的releaseConnection方法时,会判断归还的连接是否可用,如果不可用会直接从连接池中移除这个对象 代码:org.apache.http.impl.conn.PoolingHttpClientConnectionManager#releaseConnection CloseableHttpResponse对象的close方法 最终会调用org.apache.http.impl.conn.PoolingHttpClientConnectionManager#releaseConnection 可以看到,当调用response对象的close方法,会关闭socket,同时释放连接到连接池。这里顺便说一下,连接的close方法跟shutdown方法的区别在于,close方法会尝试将未写完的数据全部写入server端,而shutdown会直接丢弃 EntityUtils的consume方法跟toString方法以及关闭HttpEntity中的流 EntityUtils的consume、toString最终都是调用HttpEntity.getContent().close方法,实际都是在关闭HttpEntity中的流 最终会调用:org.apache.http.impl.execchain.ResponseEntityProxy#streamClosed wrapped.close()最终会调用org.apache.http.impl.io.ContentLengthInputStream#close,代码如下: 可以看到,它只是简单的读取数据但没有进行其它任何操作,这实际是为了释放我们在前文提到了内存。这是为了安全的复用连接,我们需要将上次请求接收并缓存的所有数据清理干净,否则下次使用这个连接时可能读取到上次请求没有读取完的数据 CloseableHttpClient对象的close方法 这个方法会关闭所有HttpClient对象涉及的资源,包括连接池,HttpClient对象建议全局共享一个,因此一般不会调用 |
CopyRight 2018-2019 实验室设备网 版权所有 |