Netty是如何解决JDK中的Selector的bug的?

Selector BUG: JDK NIO的BUG,

例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致CPU 100%,

官方声称在JDK 1.6版本的update18修复了该问题,但是直到JDK1.7版本该问题仍旧存在,只不过该BUG发生

概率降低了一些而已,它并没有被根本解决,甚至JDK1.8的131版本中仍然存在

这个问题的具体原因是:

在部分Linux的2.6的Kernel中。poll和epoll对于突然中断的连接socket会对返回的eventSet

事件集合置为POLLHUP或POLLERR,eventSet事件集合发生了变化,这就可能导致Selector会被唤醒。但是这个时候selector的select方法返回numKeys是0,所以下面本应该对key值进行遍历的事情处理根本执行不了,又回到最上面的while(true)循环,循环往复,不断的轮询,直到Linux系统出现100%的CPU情况,最终导致程序崩溃

Netty解决办法

对Selector的select操作周期进行统计,每完成一次空的select操作进行一次技术,若在某个周期内连续发生N次空轮询,则触发了epoll死循环bug.重建Selector,判断是否是其他线程发起的重建请求,若不是则将原SocketChannel从旧的Selector上去除注册,重新注册到新的Selector上,并将原来的Selector关闭,NioEventLoop的select方法中

相关推荐
NeoGressAI外贸数字化几秒前
外贸建站:新手怎么自建独立站完整指南
java·人工智能
前端 贾公子2 分钟前
第09章:上下文与记忆 (4)
java·服务器·前端
华允物联-HUAIOT4 分钟前
基于网络IO的水泵远程控制系统方案
网络·物联网
我爱cope4 分钟前
【计算机网络 | 网络层10:OSPF 与 BGP:自治系统内部和互联网之间如何路由?】
网络·学习·计算机网络·智能路由器
wjjzhbb15 分钟前
中小团队敏捷转型:Scrum还是看板?
java·maven·scrum
GodSure091424 分钟前
Java单一职责原则SRP详解
java·python·单一职责原则
sun00770026 分钟前
高德等应用走私有apn网络
网络
探数API小喇叭28 分钟前
基站查询 API 怎么用?LAC、CELLID 参数详解与实战】
java·开发语言·api·基站定位
catino29 分钟前
spring-IOC、DI
java·spring·rpc
XR12345678836 分钟前
连锁多分支办公网络怎么选?统一运维与快速开局是关键
运维·网络·php