Java NIO根据操作系统不同, 针对Selector有不同的默认实现:
- macosx:KQueueSelectorProvider
- solaris:DevPollSelectorProvider
- Linux:EPollSelectorProvider (Linux kernels >= 2.6)或 PollSelectorProvider
- windows: WindowsSelectorProvider
为什么netty还要提供一个基于epoll的实现
自4.0.16起, Netty为Linux通过JNI的方式提供了native socket transport.
NioEventLoopGroup→EpollEventLoopGroupNioEventLoop→EpollEventLoopNioServerSocketChannel→EpollServerSocketChannelNioSocketChannel→EpollSocketChannel
原因:
Netty的epoll transport使用epoll边缘触发 而java nio使用epoll水平触发(在这个模式下,io来了数据,就只通知这些io设备对应的fd,上次通知过的fd不再通知,内核不用扫描一大堆fd)netty epoll transport暴露了更多的java nio没有的配置参数, 如TCP_CORK,SO_REUSEADDR等