源码教程 2025年06月7日
0 收藏 0 点赞 348 浏览 1423 个字
摘要 :

这周遇到一个连接断开的问题,便沿着这条线学习了一下Java NIO,顺便验证一下Tomcat作为spring boot默认的web容器,是怎样管理空闲连接的。 Java NIO(new IO/non-bloc……

Java NIO与Tomcat简单连接调优

这周遇到一个连接断开的问题,便沿着这条线学习了一下Java NIO,顺便验证一下Tomcat作为spring boot默认的web容器,是怎样管理空闲连接的。

Java NIO(new IO/non-blockingIO)不同于BIO,BIO是堵塞型的,并且每一条学习路线的IO章节都会从BIO说起,因此大家非常熟悉。而NIO涉及Linux底层的select,poll,epoll等,要求对Linux的网络编程有扎实功底,反正我是没有搞清楚,在此推荐一篇通俗易懂的入门文章:

Java NIO与Tomcat简单连接调优

底层的技术先交给大神们解决,我们着重从Java上层应用的角度了解一下。

JDK 1.5起使用epoll代替了传统的select/poll,极大提升了NIO的通信性能,因此下文提到Java NIO都是使用epoll的。

Java NIO涉及到的三大核心部分ChannelBufferSelector,它们都十分复杂,单单其中一部分都能写成一篇文章,就不班门弄斧了。此处贴上一个自己学习NIO时设计的样例,功能是服务器发布服务,客户端连上服务器,客户端向服务器发送若干次请求,达到若干次答复后,服务器率先断开连接,随后客户端也断开连接。

NIO服务器端关键代码

Java NIO与Tomcat简单连接调优

NIO客户端关键代码

Java NIO与Tomcat简单连接调优

服务器日志

Java NIO与Tomcat简单连接调优

客户端日志

Java NIO与Tomcat简单连接调优

从这个样例可以看到,客户端和服务器都能根据自身的策略,与对端断开连接,本例中是服务器首先断开连接,根据TCP协议,必然有一个时刻服务器处于FIN_WAIT_2状态,而客户端处于CLOSE_WAIT状态


Java NIO与Tomcat简单连接调优

我们通过netstat命令找出这个状态,果不其然。

Java NIO与Tomcat简单连接调优

但是JDK提供的NIO接口还是很复杂很难写的,要用好它就必须借助于NettyMina等第三方库的封装,这部分就先不写了。接下来考虑另外一个问题,在大并发的场景下,成千上万的客户端涌入与服务器连接,连接成功后不发送请求,浪费了服务器宝贵的资源,这时服务器该如何应对?

答案当然是设计合适的连接池来管理这些宝贵的资源,为此我们选用Tomcat作为学习对象,了解一下它是如何管理空闲连接的。

TomcatConnector组件用于管理连接,Tomcat8默认使用Http11NioProtocol,它有一个属性ConnectionTimeout,注释如下:

Java NIO与Tomcat简单连接调优

可以简单理解成空闲超时时间,超时后Tomcat会主动关闭该连接来回收资源。

我们将它修改为10秒,得到如下配置类,并将该spring boot应用打包成tomcat-server.jar

Java NIO与Tomcat简单连接调优

我们将上文的NIO客户端略微修改一下形成TomcatClient,功能就是连上服务器后什么都不做。

Java NIO与Tomcat简单连接调优

分别运行服务器和客户端,可以看到客户端打印如下日志

Java NIO与Tomcat简单连接调优

30:27连上服务器,不进行任何请求,经过10秒后到30:37被服务器断开了连接。

此时netstat会发现还有一个TIME_WAIT的连接

Java NIO与Tomcat简单连接调优

Java NIO与Tomcat简单连接调优

根据TCP协议主动断开方必须等待2MSL才能关闭连接,Linux默认的2MSL=60秒(顺带说一句网上很多资料说CentOS/proc/sys/net/ipv4/tcp_fin_timeout能修改2MSL的时间,实际并没有效果,这个参数应该是被写进内核,必须重新编译内核才能修改2MSL)。持续观察netstat发现31:36的时候TIME_WAIT连接还在,到了31:38连接消失了,可以认为是31:37关闭连接,对比上文30:37刚好经过了2MSL(默认60秒)的时间。

Java NIO与Tomcat简单连接调优

注:本文转自互联网,如有侵权请及时联系我们删除

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/529.html

管理员

相关推荐
2025-07-05

对于一些使用WordPress进行外贸建站的商家来说,大部分人会通过在WordPress中添加JS代码和CSS样式表…

716
2025-07-05

当商家遇到WordPress独立站改版或者域名到期等问题时,不免会涉及到WordPress域名的更改,那么这一…

732
2025-07-05

用户在使用WooCommerce进行跨境电商独立站搭建工作时,有可能会借助WooCommerce短代码实现更加醒目…

321
2025-07-05

随着外贸建站行业的不断深入发展,WordPress的多语言功能也显得越来越重要,一个具有多语言的独立站…

1,059
2025-07-05

WooCommerce作为WordPress外贸建站生态的一部分,WooCommerce运费设置是商家在建站过程中不可忽视的…

851
2025-07-05

在外贸建站的过程中,有些商家会选择使用WordPress幻灯片为网站页面增加一定的动感和可观性,进而提…

736
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号