NIO的空轮询bug是什么?netty是如何解决NIO空轮询bug的?
文章目录
- 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的?相关推荐
- Netty : netty 3如何解决空轮询bug
1.美图 2.概述 空轮询bug参考:Netty : 臭名昭出的JDK的NIO bug(空轮询bug) 3. netty 3 如何解决 netty3采用的是第三种方案,检测重点是select函数是否返 ...
- Netty : netty 4如何解决空轮询bug
1.美图 2.概述 空轮询bug参考:Netty : 臭名昭出的JDK的NIO bug(空轮询bug) 4.netty4 解决 4.1 构建阈值 int selectorAutoRebuildThre ...
- Netty源码分析--NIO(一)
好久没写博客了,最近打算花些时间把Netty的源码好好读一读,下面是本人在学习的过程中的一些笔记,不能确保自己思考的完全是正确的,如果有错误,欢迎大家指正. 由于本人的语文功底烂的很,通篇使用大白话来 ...
- Netty精粹之JAVA NIO开发需要知道的
学习Netty框架以及相关源码也有一小段时间了,恰逢今天除夕,写篇文章总结一下.Netty是个高效的JAVA NIO框架,总体框架基于异步非阻塞的设计,基于网络IO事件驱动,主要贡献在于可以让用户基于 ...
- netty入门前置知识-NIO
netty入门前置知识-NIO Netty简介 Netty 的介绍 Netty 的应用场景 互联网行业 游戏行业 大数据领域 其它开源项目使用到 Netty Netty 的学习资料参考 Java BI ...
- Netty入门之BIO,NIO和AIO编程
Netty简介 Netty 的介绍 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目. Netty 是一个异步的.基于事件驱动的网络应用框架,用以快速开发 ...
- 【Java网络编程】:Netty实现OIO和NIO
承接上文:https://blog.csdn.net/hxcaifly/article/details/85274664 前言 单纯地使用Java JDK来实现网络NIO是一件开发成本非常高的事情.然 ...
- java nio netty 教程,4. 彤哥说netty系列之Java NIO实现群聊(自己跟自己聊上瘾了),netty实现...
4. 彤哥说netty系列之Java NIO实现群聊(自己跟自己聊上瘾了),netty实现 你好,我是彤哥,本篇是netty系列的第四篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识 ...
- netty与tomcat等nio的比较(取自zhh2009在论坛里的发言)
源讨论: http://www.iteye.com/topic/909206?page=3 另外见整理:[url=http://vanadiumlin.iteye.com/blog/1144989]n ...
最新文章
- debian php 升级,Debian和ubuntu服务器升级PHP7
- 三十天学不会TCP,UDP/IP网络编程 - RST的用法
- 抽象类的基本概念------abstract
- 网络工程师成长日记365-IBIS西安工程回忆录
- RNN和LSTM、GRU的简单理解
- 看雪Unicorn高级逆向与反混淆学习笔记
- 动态数据交换 python_如何用 Python 和 Streamlit 做交互式数据分析产品?
- python3 + selenium + (chrome and firefox)使用
- jpa 多层嵌套一对多_JPA一对多、多对多json序列化死循环问题解决
- java中service设计_JDBC中DAO+service设计思想
- 计算机备份记录陶瓷厂,陶瓷企业管理软件生产系统历史数据归档 | 了得信息技术...
- 双目视觉图像的色彩调整
- Star Way To Heaven题解(防题目重复)
- ZBrush - 动物毛发制作及渲染
- ts转换mp4 linux_佳佳AVI MP4格式转换器下载-佳佳AVI MP4格式转换器免费版下载v6.5.5.0...
- Solidworks建模画一个盒子
- 网上跨行转账将实时生效 第三方支付前景渺茫
- 深度学习:GPU云服务器是如何租用的
- win10右下角资讯怎么关 win10右下角天气怎么关
- 虐我千百遍之NS3安装
热门文章
- http下载异常_百度网站抓取异常的原因有哪些?有什么影响和解决方法?
- js array 删除指定元素_Array 原型方法源码实现解密
- centos7 改虚拟网卡名称
- MessageDigest简介
- FTP服务器配置部分
- EverNote第三方API接口测试
- java enum类探索
- 机器学习之开源库大总结
- Python:if语句
- 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库02 ——使用ambari-server安装HDP...