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

相关推荐
影寂ldy5 分钟前
C# WinForm TCP-Socket
网络·tcp/ip·c#
码匠许师傅9 分钟前
【C++ 面试真题】聊聊 C++ 的类型特征( type_traits)
java·c++·面试
java1234_小锋10 分钟前
Spring框架的创始人开发了一个Java AI智能体框架
java·人工智能·spring
夏天拐跑了西瓜12 分钟前
Eureka注册中心——单机与高可用集群搭建
java·spring cloud·微服务·eureka
Caster_Z14 分钟前
IntelliJ IDEA 安装 Qoder CN (Formerly Lingma)
java·ide·intellij-idea
前端炒粉21 分钟前
fetch+readablestream(Streamable)流式输出
java·服务器·前端
周周哈哈哈29 分钟前
网络间通信---TCP
网络
珍珠先生29 分钟前
第18章 泛型入门
java
我命由我1234530 分钟前
人脸识别 - 判断人脸是否在画面中央
java·人工智能·python·java-ee·人脸识别·android jetpack·android runtime
程序猿乐锅30 分钟前
从 dsh 源码看「一切皆插件」与 Spring IoC
java·网络·数据库·人工智能·后端·spring