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

相关推荐
小瓦码J码3 分钟前
轻量化线程池实战:忙时并发、闲时归零,搞定周期批量任务
java·后端
NagatoYukee3 分钟前
Java 商品交易实验(第二版)
java·开发语言
百珏9 分钟前
[灰度发布]:灰度流量如何匹配与识别:从特征补全到网关命中引擎
java·后端·架构
Misnearch13 分钟前
1345. 跳跃游戏 IV
java·leetcode·bfs
Bechamz14 分钟前
大数据开发学习Day34
java·大数据·学习
JoneBB15 分钟前
ABAP上传EXCEL模板并将内表内容存到两个sheet中
java·前端·数据库
手揽回忆怎么睡17 分钟前
分卷打包命令
java
openinstall全渠道统计17 分钟前
电商App推广统计方案有哪些?从广告到下单追踪解析
java·eclipse·教育电商
夕除21 分钟前
spring boot 8
java·开发语言
呉師傅21 分钟前
佳能LBP251dw打印机恢复出厂设置后变成英文菜单没有中文选项如何恢复中文菜单方法
linux·运维·服务器·网络·电脑