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

相关推荐
黄俊懿1 分钟前
【深入理解SpringCloud微服务】Spring-Security作用与原理解析
java·后端·安全·spring·spring cloud·微服务·架构师
云川之下8 分钟前
【网络】华为交换机S3700与S5700详解
服务器·网络·华为
塔能物联运维9 分钟前
设备自适应采样率忽视能耗致续航降 后来结合功耗模型动态调优
java·后端·struts
小于晏12 分钟前
基于Socket实现的主流网络协议汇总
网络·网络协议
rchmin17 分钟前
Spring Boot自动装配原理解析
java·spring boot·后端
tianyuanwo18 分钟前
深入理解iptables:规则管理与匹配机制深度解析
网络·安全·web安全
程序员小假24 分钟前
我们来说一下 synchronized 与 ReentrantLock 的区别
java·后端
益达32125 分钟前
【避坑指南】Maven依赖冲突怎么解决?用mvn dependency:tree一眼看清
java
TG:@yunlaoda360 云老大43 分钟前
如何使用华为云国际站代理商WSA配置与架构交付中的安全策略?
网络·架构·华为云
打码人的日常分享1 小时前
企业数据资产管控和数据治理解决方案
大数据·运维·网络·人工智能·云计算