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方法中

相关推荐
码农阿豪7 分钟前
Oracle 到金仓数据库迁移实战:一次真正“落地”的国产替代之旅
java·数据库·oracle
源远流长jerry17 分钟前
dpdk之kni处理dns案例
linux·网络·网络协议·ubuntu·ip
玉梅小洋19 分钟前
iperf 网络性能测试完整指南(含多服务端测试)
网络·测试工具·性能测试·iperf
Danileaf_Guo23 分钟前
我们的WireGuard管理系统支持手机电脑了!全平台终端配置,支持扫码连接,一键搞定
网络
小王不爱笑13227 分钟前
SpringBoot 整合 Ollama + 本地 DeepSeek 模型
java·spring boot·后端
毕设源码-钟学长28 分钟前
【开题答辩全过程】以 高校宿舍分配系统设计与实现为例,包含答辩的问题和答案
java
何中应29 分钟前
IDEA 中让 Git 忽略 .idea 目录
java·git·intellij-idea
無森~29 分钟前
HBase优化面试题
java·面试·hbase
PPPPickup40 分钟前
easymall---管理后端商品属性管理
java
人道领域44 分钟前
SSM框架从入门到入土(SpringFrameWork)
java·spring boot·tomcat