千家信息网

Netty对底层Selector如何优化

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要为大家展示了"Netty对底层Selector如何优化",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Netty对底层Selector如何优化"
千家信息网最后更新 2026年11月03日Netty对底层Selector如何优化

这篇文章主要为大家展示了"Netty对底层Selector如何优化",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Netty对底层Selector如何优化"这篇文章吧。

在创建NioEventLoop时会封装一个JDK底层的Selector属性

private Selector selector;

那么我们简单看一下这个Selector在JDK层面的实现

public abstract class SelectorImpl extends AbstractSelector {    protected Set selectedKeys = new HashSet();    protected HashSet keys = new HashSet();    private Set publicKeys;    private Set publicSelectedKeys;

protected SelectorImpl(SelectorProvider var1) { super(var1); if (Util.atBugLevel("1.4")) { this.publicKeys = this.keys; this.publicSelectedKeys = this.selectedKeys; } else { this.publicKeys = Collections.unmodifiableSet(this.keys); this.publicSelectedKeys = Util.ungrowableSet(this.selectedKeys); } }}

从源码中我们可以发现, 当服务器监听到事件后会封装成SelectionKey放到HashSet中, 然后程序就可以从这个HashSet中取出事件进行处理.

而HashSet的add方法的时间复杂度是O(n), 为此Netty通过反射机制, 将底层的这个HashSet用数组替换了, 毕竟向数组中添加数据的时间复杂度是O(1), 那么我们从代码中找到答案吧.

NioEventLoop(NioEventLoopGroup parent, Executor executor, SelectorProvider selectorProvider,                 SelectStrategy strategy, RejectedExecutionHandler rejectedExecutionHandler) {            selector = openSelector();}

跟进openSelector()方法

private SelectorTuple openSelector() {  final SelectedSelectionKeySet selectedKeySet = new SelectedSelectionKeySet();}

它创建了一个SelectedSelectionKeySet对象, 我们再看下这个类

final class SelectedSelectionKeySet extends AbstractSet {

SelectionKey[] keys; int size;

SelectedSelectionKeySet() { keys = new SelectionKey[1024]; }

@Override public boolean add(SelectionKey o) { if (o == null) { return false; }

keys[size++] = o; if (size == keys.length) { increaseCapacity(); }

return true; }}

从这里我们可以发现, 这个Set集合底层使用的是数组, 调用add方法时直接向数组中添加元素就可以, 时间复杂度O(1).

接下来看下Netty使用反射替换掉那个HashSet

Field selectedKeysField = selectorImplClass.getDeclaredField("selectedKeys");Field publicSelectedKeysField = selectorImplClass.getDeclaredField("publicSelectedKeys");          
selectedKeysField.set(unwrappedSelector, selectedKeySet);publicSelectedKeysField.set(unwrappedSelector, selectedKeySet);

Netty就是通过反射用这个SelectedSelectionKeySet类替换掉了Selector类中的HashSet.

这个地方之所以被Netty搞成这样, 其实还是为了性能. 因为这个地方是涉及数据读写的源头, 如果这个地方的性能不高, 会严重影响到程序的性能. 这也归根结底回到了数据结构的知识.

以上是"Netty对底层Selector如何优化"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

底层 数组 复杂 内容 地方 复杂度 性能 数据 方法 时间 篇文章 反射 事件 知识 程序 学习 封装 帮助 归根结底 为此 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司排名 科技互联网公司装修 互联网核心科技是什么 科技企业和互联网企业 朗涯互联网科技 狮子座互联网科技培训 互联网时代科技改变生活 呼和浩特新华互联网科技学院 亳州好赞互联网科技有限公司 明优互联网科技有限公司 互联网金融科技名词解释 南通创西澳互联网科技有限公司 互联网公司高科技产品 互联网风格科技公司名称 珠海东科互联网科技有限公司 广州智享互联网科技 版纳互联网科技选哪家 兰石爱特工业互联网科技分公司 互联网科技大会大佬 山东亿川互联网科技有限责任公司 互联网科技有限公司 互联网最新的科技有限公司 互联网 科技创业 互联网 科技服务平台 成都互联网科技公司100强 996高科技互联网公司 宇信科技在杭州互联网排第几 福仕德教育科技互联网 互联网科技职业技能培训学校 青岛易易互联网科技
0