No buffer space available错误解决方案
生产环境,突然爆发问题,网络正常,但是报网络不通错误,重启tomcat立刻好使
开始以为是tomcat的问题,调查了很久,后来加上堆栈日志才发现
简单来说,就是1-4分钟之内,使用了大量的http请求,达到了操作系统限制的最大值,所以许多请求处于wait状态,导致程序错误
原代码,httpClient 未关闭
finally { if (is != null) { is.close(); } if (postMethod != null) { postMethod.releaseConnection(); } }
新代码,httpClient正确关闭
finally { if (is != null) { try{ is.close(); }catch(Exception e){ } } if(postMethod!=null) postMethod.releaseConnection(); if(httpClient!=null) httpClient.getHttpConnectionManager().closeIdleConnections(0); }
改完这个没好使...[2018/10/18更新]
继续查资料,发现与操作系统有关,此程序所在系统是windowsServer2003 32位
修改注册表
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters
新建 DWORD 类型的注册表项,命名为:MaxUserPort
值数据: 60000(用十进制的格式录入进去,此值的有效范围为5000-65534)
新建 DWORD 类型的注册表项,命名为:TCPTimedWaitDelay
值数据: 30(用十进制的格式录入进去,TIME_WAIT的自动断开时间,默认为4分钟)
HKEY_LOCAL_MACHINE/CurrentControlSet/Services/Tcpip/Parameters下的以下三个参数:
KeepAliveInterval,设置其值为1000(用十进制的格式录入进去)
KeepAliveTime,设置其值为300000(单位为毫秒,300000代表5分钟) (用十进制的格式录入进去)
TcpMaxDataRetransmissions,设置其值为5(用十进制的格式录入进去)
祝开发顺利!