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

相关推荐
米羊1215 分钟前
fastjson (1概述)
网络·安全
qq13267029408 分钟前
ARM版统信UOS桌面安装JDK
java·jdk·arm·统信uos·毕昇jdk 11
bkspiderx16 分钟前
HTTP跨域问题深度解析:4种实用解决方案与场景适配
网络·http·nginx反向代理·cors·跨域资源共享·http跨域问题
码头工人24 分钟前
【架构师系列】风控场景下超高并发频次计算服务的设计与实践
java·架构·风控·反爬
沐浴露z25 分钟前
详细解析 SYN泛洪
服务器·网络
北方的流星34 分钟前
华为PPPoE协议的配置
运维·网络·华为
长不大的蜡笔小新40 分钟前
私人健身房管理系统
java·javascript·spring boot
hdsoft_huge1 小时前
Java 实现高效查询海量 geometry 及 Protobuf 序列化与天地图前端分片加载
java·前端·状态模式
xiaowu0801 小时前
IEnumerable、IEnumerator接口与yield return关键字的相关知识
java·开发语言·算法
笨手笨脚の1 小时前
深入理解 Java 虚拟机-01 JVM 内存模型
java·jvm··虚拟机栈·方法区