ESTABLISHED 表示正在进行网络连接的数量

TIME_WAIT 表示表示等待系统主动关闭网络连接的数量

CLOSE_WAIT 表示被动等待程序关闭的网络连接数量

上篇文章给出了解决TIME_WAIT太多的方法,本篇文章以HttpClient为例说明解决大量CLOSE_WAIT状态的方法。

HttpClient是大量使用的用于HTTP连接的包,首先需要说明的是HttpClient 3.x和4.x之间API差距很多,不过强烈建议使用4.x的版本。除此之外,4.x中每个x之间也有一些差别(比如一些弃用的类,新增加的类等),这里以4.2.3版本进行说明。

HttpClient使用的HTTP 1.1协议进行连接,相对于HTTP 1.0来说有一个持续连接的增强,为了充分利用持续连接的特性,在一次连接结束之后,即使将HttpResponse使用close方法关闭,并且将调用了HttpGet或HttpPost的releaseConnection方法,示例代码如下:

HttpGet method = null;

HttpResponse response = null;

try {

method = new HttpGet(url);

response = client.execute(method);

} catch(Exception e) {

} finally {

if(response != null) {

EntityUtils.consumeQuietly(response.getEntity());

}

if(method != null) {

method.releaseConnection();

}

}

这个时候仍然发现连接处于CLOSE_WAIT状态,这是因为HttpClient在执行close的时候,如果发现Response的Header中Connection是Keep-alive则连接不会关闭,以便下次请求相同网站的时候进行复用,这是产生CLOSE_WAIT连接的原因所在。

最简单的一种解决方法在execute方法之前增加Connection: close头信息,HTTP协议关于这个属性的定义如下:

HTTP/1.1 defines the "close" connection option for the sender to signal that the connection will be closed after completion of the response. For example:

Connection: close

示例代码如下:

HttpGet method = null;

HttpResponse response = null;

try {

method = new HttpGet(url);

method.setHeader(HttpHeaders.CONNECTION, "close");

response = client.execute(method);

} catch(Exception e) {

} finally {

if(response != null) {

EntityUtils.consumeQuietly(response.getEntity());

}

if(method != null) {

method.releaseConnection();

}

}

当然,也有人建议每次请求之后关闭client,但这一点不符合HttpClient设计的原则——复用。如果每次连接完成之后就关闭连接,效率太低了。因此,需要使用PoolingClientConnectionManager,并且设置maxTotal(整个连接池里面最大连接数,默认为20)和defaultMaxPerRoute(每个主机的最大连接数,默认为2),另外client还有一个ClientPNames.CONN_MANAGER_TIMEOUT参数,用来设置当连接不够获取新连接等待的超时时间,默认和CoreConnectionPNames.CONNECTION_TIMEOUT相同。可以根据实际情况对PoolingClientConnectionManager进行设置,以达到效率最优。

还有一种情况也会造成大量CLOSE_WAIT连接,即HttpResponse的状态码不是200的时候,需要及时调用method.abort()方法对连接进行释放,详细可以参考这篇文章。

java close wait过多_HttpClient当HTTP连接的时候出现大量CLOSE_WAIT连接相关推荐

  1. java tcp client 断开_HttpClient出现TCP连接异常关闭发送RST包

    问题现象 在与第三方系统通过http交互数据的过程中,抓包发现每次TCP连接都是异常关闭,报文如下: 可以看到,由我方发起3次握手建立连接,然后发送http请求,对方响应数据,我方ACK后直接发RST ...

  2. closewait过多服务器无响应,CLOSE_WAIT连接过多的现象分析与处理

    CLOSE_WAIT连接过多的现象分析与处理 未分类 1. CLOSE_WAIT的机制和原理一. 来自参考资料:从问题看本质: 研究TCP close_wait的内幕 客户端主动发起 socket.c ...

  3. java close wait过多_我是如何确认线上CLOSE_WAIT产生的原因及如何解决的。

    1.阐述 内部架构:Tomcat应用程序---> nginx ---> 其他Tomcat应用程序,内部Tomcat应用通过nginx调用其他应用. HTTP插件:HttpClient 4. ...

  4. java if else 过多_Java中if-else过多怎么解决

    Java中if-else过多怎么解决 发布时间:2020-11-11 14:35:36 来源:亿速云 阅读:98 作者:Leah Java中if-else过多怎么解决?很多新手对此不是很清楚,为了帮助 ...

  5. java连接mysql 5.7数据库_javaJDBC连接mysql(5.7)数据库,一看就懂的详细例子

    不多比比 直接上代码 package Demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql. ...

  6. java数据库编程——元数据(metadata)+web 与企业应用中的连接管理

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程--元数据(metadata)+web 与企业应用中的连接管 ...

  7. close_wait过多服务器无响应,记一次大量CLOSE_WAIT连接导致的服务宕机

    最近线上服务出现了一段时间的无法响应,在此总结一下问题的排查过程. 监控信息 监控显示CPU和内存没有异常波动,TCP连接中有大量的CLOSE_WAIT状态的连接. 看一下TCP连接断开的过程: 也就 ...

  8. java中异常+连接重置_java.net.SocketException:连接重置

    你应该仔细检查完整的痕迹, 我有一个服务器套接字应用程序并修复了 java.net.SocketException: Connection reset 案例 . 在我的情况下,它发生在从clientS ...

  9. java mysql 连接测试_java连接mysql数据库及测试是否连接成功的方法

    本文实例讲述了java连接mysql数据库及测试是否连接成功的方法.分享给大家供大家参考,具体如下: package com.test.tool; import java.sql.Connection ...

最新文章

  1. 美团分布式服务治理框架OCTO之二:Mesh化
  2. python debugger_彻底搞定反调试之无限debugger
  3. python老王卖西瓜_使用Python爬取京东商品晒单图
  4. 前端学习(2766):生命周期函数
  5. C语言 返回指针的函数--指针函数 int* max(int a)
  6. IBM 技术文档:Spark, 快速数据分析的又一选择
  7. 【英语学习】【WOTD】teetotaler 释义/词源/示例
  8. 《转》SAP RM07扩展
  9. python批量删除文件名_用python批量删掉文件名中共同存在的字符
  10. 注册测绘师划出后的分析与思考
  11. 条形码类别及如何区分
  12. 面试时如何做自我介绍?聪明的应聘者只聚焦1点
  13. win10解除usb禁用_Win10系统禁用usb存储设备的设置方法
  14. 广告投放中的ROI是怎么计算的?
  15. esp8266基本使用 - GET|POST
  16. creo草绘工程图标注字体大小、加粗设置
  17. GitLab CI/CD 多项目,多流水线制品合并方案
  18. X1 carbon 2015安装win7、win10后触控板驱动安装失败(双指滑动无效、多指操作无效)的另类解决之道
  19. Fall 2020 Berkeley cs61a hw01答案
  20. SAP EPIC 银企直连 付款接口(建设银行)

热门文章

  1. C语言实现hello world代码
  2. python etree pandas_python爬虫Xpath,pandas示例
  3. 苹果“造车梦”要碎?造车项目前负责人跳槽到福特汽车
  4. 贾跃亭:在性能、奢华和科技综合评比中 FF 91战胜了奔驰S迈巴赫、库里南
  5. 我和2000万人在B站刷凤凰传奇
  6. ROG游戏手机5跑分曝光:全球首发18GB超大内存
  7. 苹果汽车自动驾驶又出新信号:正与多家激光雷达供应商谈判
  8. 网友用筋膜枪提升手速抢茅台,平台回应不可靠,用了你也抢不到!
  9. 一亿像素下放!Redmi Note 10系列相机曝光:长焦微距全都有
  10. 盈利靠涨价、广告满屏飞,共享充电宝入局容易做大难