一、问题现象
某基于 Java 应用在 Windows Server 上运行一段时间后,突然抛出异常:
java.net.SocketException: No buffer space available (maximum connections reached?): connect 或 java.net.BindException: Address already in use: getsockopt
应用无法处理新请求,重启后短暂恢复,但几小时后再次出现相同错误。初步判断为系统资源耗尽,但具体原因需要深入排查。
二、环境信息
- 操作系统:Windows Server 2019
- JDK 版本:Java 17.0.14
- 应用框架:Spring Boot 2.x
- 进程 PID:12345(示例)
三、排查过程
1. 检查 TCP 连接总数
以管理员身份打开命令提示符,执行:
netstat -an | find /c "TCP"
输出结果:
63113
系统当前存在63,113个 TCP 连接,远超正常水平。
2. 检查动态端口范围
netsh int ipv4 show dynamicport tcp
输出:
协议 tcp 动态端口范围 ---------------------------------
启动端口 : 9000
端口数 : 56000
动态端口范围已设置为 9000~64999(共 56000 个),但连接数已超过此范围,端口耗尽。
3. 分析连接状态分布
统计各种状态的连接数量:
netstat -an | find /c "TIME_WAIT"
netstat -an | find /c "ESTABLISHED"
netstat -an | find /c "CLOSE_WAIT"
输出示例:
TIME_WAIT: 281
ESTABLISHED: 7120
CLOSE_WAIT: 55690
关键发现:55,690个连接处于 CLOSE_WAIT 状态,占总连接数约 88%,这是典型的连接泄漏。
4. 查看 CLOSE_WAIT 连接的详细信息
netstat -ano | findstr CLOSE_WAIT


