文章目录

  • 1. NIO的空轮询bug
  • 2. netty如何解决NIO空轮询bug的?

1. NIO的空轮询bug

JDK1.5开始引入了epoll基于事件响应机制来优化NIO。相较于select和poll机制来说,epoll机制将事件处理交给了操作系统内核(操作系统硬中断)来处理,优化了elect和poll模型的无效遍历问题。

但是JDK中epoll的实现却是有漏洞的,其中最有名的就是NIO空轮询bug。理论上无客户端连接时Selector.select() 方法会阻塞,但空轮询bug导致:即使无客户端连接,NIO照样不断的从select本应该阻塞的Selector.select()中wake up出来,导致CPU100%问题。,如下图所示:

如上图所示,NIO程序一直处于while死循环中,不断向cpu申请资源导致CPU 100%! 官方声称在JDK1.6版本的update18修复了该问题,但是直到JDK1.7、JDK1.8版本该问题仍旧存在,只不过该BUG发生概率降低了一些而已,它并没有被根本解决。

2. netty如何解决NIO空轮询bug的?

虽然netty底层是对NIO的高度封装,但netty并没有空轮询导致cpu 100%的情况,那么netty是怎么做的呢?

进入netty的select源码可以看到,netty底层也是调用NIO的selector方法,但netty用selectCnt来记录轮询次数。

        selectCnt 在正常逻辑时,会被重新赋值为1,在出现空轮询bug时会累加,直到大于阈值512,则触发重构selector操作。从这里可以看到netty并没有真正解决NIO的epoll模型的bug,而是采用替换selector的操作巧妙的避开了空轮询bug!

开启一个线程重构Selector

把旧的Selector中已注册的SelectionKey,全部挪到新的 Selector中去


成员变量this.selector 指向新的Selector的引用

至此,netty解决空轮询bug结束!

NIO的空轮询bug是什么?netty是如何解决NIO空轮询bug的?相关推荐

  1. Netty : netty 3如何解决空轮询bug

    1.美图 2.概述 空轮询bug参考:Netty : 臭名昭出的JDK的NIO bug(空轮询bug) 3. netty 3 如何解决 netty3采用的是第三种方案,检测重点是select函数是否返 ...

  2. Netty : netty 4如何解决空轮询bug

    1.美图 2.概述 空轮询bug参考:Netty : 臭名昭出的JDK的NIO bug(空轮询bug) 4.netty4 解决 4.1 构建阈值 int selectorAutoRebuildThre ...

  3. Netty源码分析--NIO(一)

    好久没写博客了,最近打算花些时间把Netty的源码好好读一读,下面是本人在学习的过程中的一些笔记,不能确保自己思考的完全是正确的,如果有错误,欢迎大家指正. 由于本人的语文功底烂的很,通篇使用大白话来 ...

  4. Netty精粹之JAVA NIO开发需要知道的

    学习Netty框架以及相关源码也有一小段时间了,恰逢今天除夕,写篇文章总结一下.Netty是个高效的JAVA NIO框架,总体框架基于异步非阻塞的设计,基于网络IO事件驱动,主要贡献在于可以让用户基于 ...

  5. netty入门前置知识-NIO

    netty入门前置知识-NIO Netty简介 Netty 的介绍 Netty 的应用场景 互联网行业 游戏行业 大数据领域 其它开源项目使用到 Netty Netty 的学习资料参考 Java BI ...

  6. Netty入门之BIO,NIO和AIO编程

    Netty简介 Netty 的介绍 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目. Netty 是一个异步的.基于事件驱动的网络应用框架,用以快速开发 ...

  7. 【Java网络编程】:Netty实现OIO和NIO

    承接上文:https://blog.csdn.net/hxcaifly/article/details/85274664 前言 单纯地使用Java JDK来实现网络NIO是一件开发成本非常高的事情.然 ...

  8. java nio netty 教程,4. 彤哥说netty系列之Java NIO实现群聊(自己跟自己聊上瘾了),netty实现...

    4. 彤哥说netty系列之Java NIO实现群聊(自己跟自己聊上瘾了),netty实现 你好,我是彤哥,本篇是netty系列的第四篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识 ...

  9. netty与tomcat等nio的比较(取自zhh2009在论坛里的发言)

    源讨论: http://www.iteye.com/topic/909206?page=3 另外见整理:[url=http://vanadiumlin.iteye.com/blog/1144989]n ...

最新文章

  1. debian php 升级,Debian和ubuntu服务器升级PHP7
  2. 三十天学不会TCP,UDP/IP网络编程 - RST的用法
  3. 抽象类的基本概念------abstract
  4. 网络工程师成长日记365-IBIS西安工程回忆录
  5. RNN和LSTM、GRU的简单理解
  6. 看雪Unicorn高级逆向与反混淆学习笔记
  7. 动态数据交换 python_如何用 Python 和 Streamlit 做交互式数据分析产品?
  8. python3 + selenium + (chrome and firefox)使用
  9. jpa 多层嵌套一对多_JPA一对多、多对多json序列化死循环问题解决
  10. java中service设计_JDBC中DAO+service设计思想
  11. 计算机备份记录陶瓷厂,陶瓷企业管理软件生产系统历史数据归档 | 了得信息技术...
  12. 双目视觉图像的色彩调整
  13. Star Way To Heaven题解(防题目重复)
  14. ZBrush - 动物毛发制作及渲染
  15. ts转换mp4 linux_佳佳AVI MP4格式转换器下载-佳佳AVI MP4格式转换器免费版下载v6.5.5.0...
  16. Solidworks建模画一个盒子
  17. 网上跨行转账将实时生效 第三方支付前景渺茫
  18. 深度学习:GPU云服务器是如何租用的
  19. win10右下角资讯怎么关 win10右下角天气怎么关
  20. 虐我千百遍之NS3安装

热门文章

  1. http下载异常_百度网站抓取异常的原因有哪些?有什么影响和解决方法?
  2. js array 删除指定元素_Array 原型方法源码实现解密
  3. centos7 改虚拟网卡名称
  4. MessageDigest简介
  5. FTP服务器配置部分
  6. EverNote第三方API接口测试
  7. java enum类探索
  8. 机器学习之开源库大总结
  9. Python:if语句
  10. 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库02 ——使用ambari-server安装HDP...