原创 

Netty是如何解决 JDK epoll 空轮询的 Bug 呢

分类:java    438人阅读    IT小君  2023-09-17 11:21

我们抛开其他细枝末节,直接定位到事件轮询 select() 方法中的最后一部分代码,一起看下 Netty 是如何解决 epoll 空轮询的 Bug。

long time = System.nanoTime();
if (time - TimeUnit.MILLISECONDS.toNanos(timeoutMillis) >= currentTimeNanos) {
    selectCnt = 1;
} else if (SELECTOR_AUTO_REBUILD_THRESHOLD > 0 &&
        selectCnt >= SELECTOR_AUTO_REBUILD_THRESHOLD) {
    selector = selectRebuildSelector(selectCnt);
    selectCnt = 1;
    break;
}

Netty 提供了一种检测机制判断线程是否可能陷入空轮询,具体的实现方式如下:

  1. 每次执行 Select 操作之前记录当前时间 currentTimeNanos。

  2. time - TimeUnit.MILLISECONDS.toNanos(timeoutMillis) >= currentTimeNanos,如果事件轮询的持续时间大于等于 timeoutMillis,那么说明是正常的,否则表明阻塞时间并未达到预期,可能触发了空轮询的 Bug。

  3. Netty 引入了计数变量 selectCnt。在正常情况下,selectCnt 会重置,否则会对 selectCnt 自增计数。当 selectCnt 达到 SELECTOR_AUTO_REBUILD_THRESHOLD(默认512) 阈值时,会触发重建 Selector 对象。

Netty 采用这种方法巧妙地规避了 JDK Bug。异常的 Selector 中所有的 SelectionKey 会重新注册到新建的 Selector 上,重建完成之后异常的 Selector 就可以废弃了。

html5图标下拉搜索框自动匹配代码

html5 canvas彩色碎片组合球形旋转动画特效

现代时尚家具公司网站模板

有机水果蔬菜HTML5网站模板

小众时尚单品在线电子商务网站模板

中小型创意设计服务公司网站模板

html5 canvas进度条圆环图表统计动画特效

css+js实现的颜色渐变数字时钟动画特效

响应式太阳能能源公司网站模板

响应式咖啡饮品宣传网站模板

js+css3抽奖转盘旋转点餐代码

HTML5数字产品服务公司网站模板

jQuery右端悬浮带返回顶部特效

网页设计开发公司网站模板

响应式时尚单品在线商城网站模板

css鼠标跟随文字模糊特效

canvas炫酷鼠标移动文字粒子特效

HTML5 Canvas竖直流动线条背景动画特效

HTML5现代家居装潢公司网站模板

html5 svg夜空中星星流星动画场景特效

 工具推荐 更多»