尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

【Netty源码解读和权威指南】第34篇:Netty Selector优化——为什么比JDK NIO快这么多

【Netty源码解读和权威指南】第34篇:Netty Selector优化——为什么比JDK NIO快这么多
📅 发布时间:2026/6/21 4:28:23

上一篇【第33篇】Netty连接管理与心跳检测——工业级断连处理方案
下一篇【第35篇】Netty时间轮HashedWheelTimer源码解析——百万定时任务的秘密


一、优化一:替换JDK SelectedKeySet

JDK Selector的selectedKeys()返回HashSet,遍历时需要Iterator,有大量装箱/拆箱开销。

Netty的做法:用SelectedSelectionKeySet(基于数组)替换HashSet。

// 反射替换底层SetfinalclassSelectedSelectionKeySetextendsAbstractSet<SelectionKey>{SelectionKey[]keys=newSelectionKey[1024];intsize;publicbooleanadd(SelectionKeykey){if(size==keys.length)returnfalse;keys[size++]=key;// O(1)追加,不需要hash计算returntrue;}publicvoidreset(){size=0;// O(1)清空,不需要逐个removeArrays.fill(keys,null);// 帮助GC}}// 遍历时直接for循环访问数组,比Iterator快很多for(inti=0;i<selectedKeys.size;i++){SelectionKeyk=selectedKeys.keys[i];// 处理...}

性能对比:10万连接,Netty遍历selectedKeys比JDK快3-5倍。


二、优化二:解决epoll空轮询Bug

JDK在Linux下存在epoll空轮询Bug:Selector.select()没有事件却返回,导致CPU 100%。

Netty的检测与修复:

// NioEventLoop中检测空轮询if(SELECTOR_AUTO_REBUILD_THRESHOLD>0){longselectTime=System.nanoTime()-time;if(selectTime<1000000000/10){// 小于100ms就算空轮询emptyPollingCount++;if(emptyPollingCount>512){// 连续512次空轮询rebuildSelector();// 重建Selector!emptyPollingCount=0;}}else{emptyPollingCount=0;}}// rebuildSelector:创建新Selector,将旧Channel重新注册publicvoidrebuildSelector(){SelectornewSelector=SelectorProvider.provider().openSelector();for(SelectionKeykey:oldSelector.keys()){Channelch=(Channel)key.attachment();ch.register(newSelector,key.interestOps(),ch);}oldSelector.close();this.selector=newSelector;}

三、优化三:批量处理任务

// runAllTasks可以一次处理多个任务,减少线程切换protectedbooleanrunAllTasks(longtimeoutNanos){fetchFromScheduledTaskQueue();Runnabletask=pollTask();if(task==null)returnfalse;longdeadline=System.nanoTime()+timeoutNanos;longrunTasks=0;for(;;){safeExecute(task);runTasks++;task=pollTask();if(task==null||System.nanoTime()>=deadline)break;}returntrue;}

四、其他优化

优化说明效果
直接内存优先I/O使用DirectBuffer减少GC
内存池PooledByteBufAllocator减少分配开销
TCP_NODELAY禁用Nagle算法降低延迟
SO_REUSEADDR端口快速复用避免TIME_WAIT

五、总结

优化技术
SelectedKeySet替换数组替代HashSet
epoll空轮询修复rebuildSelector
批量任务处理一次循环执行多个任务
关键原则减少GC、减少锁、减少系统调用

上一篇【第33篇】Netty连接管理与心跳检测——工业级断连处理方案
下一篇【第35篇】Netty时间轮HashedWheelTimer源码解析——百万定时任务的秘密


相关新闻

  • Kaggle上用Unsloth微调Qwen3-8B的实战指南
  • 单细胞基础模型中间层特征提取:任务与细胞状态依赖的最优表示
  • 2026年口碑好的山东SGZ刮板输送机/山东刮板输送机刮板高口碑品牌推荐 - 品牌宣传支持者

最新新闻

  • 安全构建AI命令行工具链:从Ollama到Typer的可审计实践
  • 7步彻底解决华硕主板风扇控制难题:FanControl深度优化指南
  • 情感 AI 陪伴产品开发:多模态情绪识别与共情响应机制
  • 国内薪酬体系咨询机构盘点:聚焦适配性与落地价值 - 互联网科技品牌测评
  • llama.cpp加载Qwen 3.5-9B GGUF量化模型实战指南
  • 2026杭州高性价比龙井茶推荐,十大口碑品牌实力测评不踩坑 - myqiye

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号