资讯专栏INFORMATION COLUMN

Java nio 空轮询bug

beanlam / 992人阅读

这个应该是很老的bug了,linux平台,jdk6好像就修复了

bug 描述 :https://bugs.java.com/bugdata...

This is an issue with poll (and epoll) on Linux. If a file descriptor for a connected socket is polled with a request event mask of 0, and if the connection is abruptly terminated (RST) then the poll wakes up with the POLLHUP (and maybe POLLERR) bit set in the returned event set. The implication of this behaviour is that Selector will wakeup and as the interest set for the SocketChannel is 0 it means there aren"t any selected events and the select method returns 0.

之前一直不知道event mask 为0 代表啥,知道翻到了资料

http://man7.org/linux/man-pag...

The field events is an input parameter, a bit mask specifying the
events the application is interested in for the file descriptor fd.
This field may be specified as zero, in which case the only events
that can be returned in revents are POLLHUP, POLLERR, and POLLNVAL
(see below).

大概知道了0代表了POLLHUP, POLLERR, and POLLNVA 这些event

继续查阅https://blog.csdn.net/tilter/...

常量    说明
POLLIN 普通或优先级带数据可读
POLLRDNORM 普通数据可读
POLLRDBAND 优先级带数据可读
POLLPRI 高优先级数据可读
POLLOUT 普通数据可写
POLLWRNORM 普通数据可写
POLLWRBAND 优先级带数据可写
POLLERR 发生错误
POLLHUP 对方描述符挂起
POLLNVAL 描述字不是一个打开的文件

大概明白了Bug描述中 abruptly terminated (RST)的含义及发生场景

也就知道什么时候会发生空轮询bug

个人记录下

还有1问题没想明白,为啥先cancel,再select(or selectNow) 还是无法避免这个问题? ref: https://www.cnblogs.com/JAYIT...
网上说,在多线程环境下,selectNow先发生,cancel后发生,这样还是会存在问题
但是,即使cancel后发生,channel也会被移到待移除channel集合了,下次再轮询的时候,select也会出发这个集合里面的channel被清除
这样,最多多一次空轮训。
目前给的方案都是open一个新的selector,把有效的channel全部注册到新的selector,再轮询新的selector

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76839.html

相关文章

  • 【Netty】学习NioEventLoop

    摘要:主从模型主从多线程多个的线程池用于接受客户端的连接。负责多路分离已连接的,读写网络数据,将业务处理功能扔给线程池完成。比如在线程内部进行串行操作,避免多线程竞争造成的性能问题。 欢迎关注公众号:【爱编程】如果有需要后台回复2019赠送1T的学习资料哦!! showImg(https://upload-images.jianshu.io/upload_images/13150128-3c...

    tulayang 评论0 收藏0
  • JDK中关于BIO,NIO,AIO,同步,异步介绍

    摘要:即可以理解为,方法都是异步的,完成后会主动调用回调函数。主要在包下增加了下面四个异步通道其中的方法,会返回一个带回调函数的对象,当执行完读取写入操作后,直接调用回调函数。 本文原创地址,我的博客:jsbintask.cn/2019/04/16/…(食用效果最佳),转载请注明出处! 在理解什么是BIO,NIO,AIO之前,我们首先需要了解什么是同步,异步,阻塞,非阻塞。假如我们现在要去银行取...

    opengps 评论0 收藏0
  • #yyds干货盘点# Netty源码分析之Reactor线程模型详解

    摘要:启动然后一路执行到方法中,调用方法启动线程。的执行流程中的方法是一个无限循环的线程,在该循环中主要做三件事情,如图所示。而这个唤醒是没有任何读写请求的,从而导致线程在做无效的轮询,使得占用率较高。 上一篇文章,分析了Netty服务端启动的初始化过程,今天我们来分析一下Netty中的Reactor线程模型在分析源...

    番茄西红柿 评论0 收藏2637
  • java-netty-Netty in Action 5th-ch1-Netty and Java

    摘要:一个多路复用器可以负责成千上万的通道,没有上限。不需要通过对多路复用器对注册的通道进行轮询操作即可实现异步读写,从而简化编程模型。同时,支持支持如果是怎么办最后,到目前位置,支持不支持二无法扩展作为的核心,无法扩展,私有构造函数。 前言 netty 学习 基于 netty in action 5th, 官网资料,网络博客等 1.1 Why Netty? netty 是一个中间层的抽象 ...

    LeviDing 评论0 收藏0
  • Netty序章之BIO NIO AIO演变

    摘要:后改良为用线程池的方式代替新增线程,被称为伪异步。最大的问题是阻塞,同步。每次请求都由程序执行并返回,这是同步的缺陷。这些都会被注册在多路复用器上。多路复用器提供选择已经就绪状态任务的能力。并没有采用的多路复用器,而是使用异步通道的概念。 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能、高可靠的网络服务器和客户端程序。Netty简化了网络程序的开发,是很多框架和公司...

    VincentFF 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<