HttpClient的释放资源到底在释放什么?如何正确的释放资源? 您所在的位置:网站首页 java中资源泄露sc永远不会关闭什么意思 HttpClient的释放资源到底在释放什么?如何正确的释放资源?

HttpClient的释放资源到底在释放什么?如何正确的释放资源?

2024-07-09 22:48| 来源: 网络整理| 查看: 265

HttpRequestBase对象的releaseConnection跟abort方法,HttpGet、HttpPost都继承了这个类。

源码如下:

abort

release

这两个方法最终都会调用cancellableRef引用的对象的cancel方法,cancellableRef在不同的时机对应不同的资源对象:ConnectionRequest,代表一个从连接池中获取连接的请求。ConnectionHolder,代表一个真实的http连接

代码位于:org.apache.http.impl.execchain.MainClientExec#execute

image-20230325235403131

当调用ConnectionRequest的cancel方法时,代表取消本次获取连接的请求。当调用ConnectionHolder的cancel方法时,代表什么呢?代码如下:org.apache.http.impl.execchain.ConnectionHolder#abortConnection

image-20230326000714850

上面代码主要做了两件事:关闭socket连接,归还连接到连接池。可能有的小伙伴会有疑问,为什么把连接绑定的socket关闭了还要将连接归还到连接池呢?这是因为连接池中的连接数量是有限制的,假设我们设置设置了最大连接数为10,如果不把这个连接归还到连接池,那么它会一直占用一个连接名额直到被驱逐策略所驱逐。并且在调用连接池的releaseConnection方法时,会判断归还的连接是否可用,如果不可用会直接从连接池中移除这个对象

代码:org.apache.http.impl.conn.PoolingHttpClientConnectionManager#releaseConnection

image-20230326001731861

CloseableHttpResponse对象的close方法

最终会调用org.apache.http.impl.conn.PoolingHttpClientConnectionManager#releaseConnection

image-20230326003013159

可以看到,当调用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

image-20230326005604357

wrapped.close()最终会调用org.apache.http.impl.io.ContentLengthInputStream#close,代码如下:image-20230326005915733

可以看到,它只是简单的读取数据但没有进行其它任何操作,这实际是为了释放我们在前文提到了内存。这是为了安全的复用连接,我们需要将上次请求接收并缓存的所有数据清理干净,否则下次使用这个连接时可能读取到上次请求没有读取完的数据

CloseableHttpClient对象的close方法

这个方法会关闭所有HttpClient对象涉及的资源,包括连接池,HttpClient对象建议全局共享一个,因此一般不会调用



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有