如果客户端不是自己设计的,那就服务器端超过多少时间杀死链接,如果是自己设计的,你可以考虑修改代码。
app退出和异常退出,都要判断是否链接服务器,有链接就关闭链接。
心跳报文,主动断链,然后重连
查一下TCP心跳机制,这个和具体实现有关。可以尝试提升心跳机制的实现,主动断链之后,然后进行重连。
Tcp连接出现大量ESTABLISHED连接解决方法_奔跑在路上的技术博客_51CTO博客 Tcp连接出现大量ESTABLISHED连接解决方法,TCP状态转移要点TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得注意的状态有两个:CLOSE_WAIT和TIME_WAIT。 1、L 【图片】 https://blog.51cto.com/qiangsh/1980383 是说这种情况吧
增加心跳 然后检测到异常主动断掉。释放资源
这是用了httpclient连接池,但是每次都创建了新的连接池而没有复用连接池里的连接吧
使用单例模式试试
必须添加连接上限,超过上限的连接直接拒绝。需要通过增加服务器并用负载均衡实现高并发支持。对于合理上限下的连接,需要定时验证连接心跳,无效连接予以关闭。
通过修改keepalive配置为合适的值(如改为200秒)可以快速释放端口连接
参考链接:tcp连接断开后不释放的解决办法:https://www.cnblogs.com/uncleyong/p/11083528.html
如果是网站应用的话,应该是有人不停的刷新网页,也有可能是cc攻击。可以使用阿里云SCDN、Web应用防火墙或DDoS防护。
1、要解决这个问题最重要的还是需要在你的程序代码上主动释放连接;
2、# sysctl -a |grep tcp_keepalive可以查看操作系统连接保持默认是2小时,所以你如果每小时只新增1000左右的话是不会出现累计到2万+的,这个你需要再排查下;
3、你可以修改这个tcp连接是否时间(net.ipv4.tcp_keepalive_time)进行测试是否满足你的要求,一般不建议修改。
#echo X > /proc/sys/net/ipv4/tcp_keepalive_time
这个问题如果要治根,需要找出程序的bug在哪:
1、检查程序所有创建连接的地方,看看每个连接是否调用了close或其它类似释放资源的方法
2、如果使用了第三方依赖创建的连接,检查依赖中提供的SDK释放连接的方法是否调用,也可以搜索这个依赖的最佳实践
3、可以使用jstack,jmap等工具分析进程的内存情况,大概率可以找到线索
4、可以dump这个进程的内存,使用JDK自带的内存分析工具或者MAT工具分析内存,可以终极找出是哪个类哪个对象没有释放
请采纳,十分感谢!
你看看这篇文章 <<Tcp连接出现大量ESTABLISHED连接解决方法>>
https://blog.csdn.net/weixin_33868027/article/details/89822196
两种方式: