在生产环境中,Netty 应用若出现大量 CLOSE_WAIT 连接,往往意味着 连接生命周期管理不健壮。这类问题不仅会消耗系统资源,还可能导致服务雪崩。本文将从 TCP 状态机、代码层面、内核参数和防御手段多角度展开分析与实战。
1. 核心结论
CLOSE_WAIT 的直接原因是: 客户端发送了 FIN 主动关闭连接,但 Netty 服务端未调用 ctx.close() 或 channel.close() 关闭自己的一端 Socket。
于是服务端进入 CLOSE_WAIT 状态,却没有继续走向 LAST_ACK,最终形成残留连接。
2. 常见原因分析
2.1 异常处理不完善(最高频)
未捕获的业务异常或错误导致异常传播到 exceptionCaught,但该方法未执行 ctx.close(),连接残留。
问题示例:
@Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { log.error("异常", cause); // ❌ 忘记 ctx.close() }修复:
@Override public void exceptionCaught(ChannelHandlerContext ctx, Throw