报错信息
java.net.BindException:Address already in use.
原因分析
1、Windows提供给TCPIP连接的端口为1024-5000,并且要四分钟左右循环回收,这就导致我们短时间内频繁调用大量请求时,端口将被占满。
2、TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间。关闭和释放之间的此时间间隔通称 TIME_WAIT 状态或两倍最大段生命周期(2MSL)状态。此时间期间,重新打开到客户机和服务器的连接的成本少于建立新连接。减少此条目的值允许 TCP/IP 更快地释放已关闭的连接,为新连接提供更多资源。如果运行的应用程序需要快速释放和创建新连接,而且由于 TIME_WAIT 中存在很多未关闭的连接,导致吞吐量比较低。
3、Close_Wait 会占用一个连接,网络可用连接小。当数量过多时,可能会引起网络性能下降,并占用系统非换页内存。尤其是在有连接池的情况下(比如 HttpRequest),会耗尽连接池的网络连接数,导致无法建立网络连接。
(1)如果是Web请求,经常是因为 Response 的 BodyStream 没有调用 Close。举个例子,Widnows 下使用 HttpWebRequest 一定要保证 GetRequestStream 和 GetResponse 对象关闭,否则容易造成连接处于 CLOSE_WAIT 状态
(2)TCP的 KeepLive 功能, 操作系统 默认 7200秒 (2小时) 自动清理一次 CLOSE_WAIT 的连接,满足不了高并发下的端口需求数。支持自定义配置。
解决办法
1、使用 win + R 快捷键或者在系统中搜索中输入cmd,打开 cmd,输入 regedit 命令打开注册表。
2、找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters目录
3、右键新建DWORD,选择十进制输入十进制对应的值;选择16进制输入16进制对应的值
DWORD | 十进制 | 十六进制 |
---|---|---|
MaxUserPort | 65534 | fffe |
TcpTimedWaitDe | 30 | 1e |
MaxDataRetries | 5 | 5 |
keepAliveTime | 107863296 | 66ddd00 |
keepAliveInterval | 1000 | 3e8 |
4、重启windows,配置项生效
https://www.cnblogs.com/xh123456/p/10654404.html