当前位置: 首页 > news >正文

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

上一篇【第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源码解析——百万定时任务的秘密


http://www.jsqmd.com/news/1052632/

相关文章:

  • GPT-4o替代Gemini的生产力迁移实战:上下文稳定性与提示词工程
  • Android应用安全加固实战:从ProGuard混淆到Dex加固的完整指南
  • 多无人机刚性负载协同运输:轨迹规划与避障算法全解析
  • Flexbox布局中的box-shadow偏移问题与解决方案
  • 基于分裂SMC与代理模型的可扩展在线模型聚类方法
  • Vue v-for原理深度解析:从数据驱动到虚拟DOM复用
  • Kaggle上用Unsloth微调Qwen3-8B的实战指南
  • 嵌入式调试利器:Tracelink硬件连接、追踪原理与实战避坑指南
  • 终极指南:如何用爱享素材下载器轻松获取多平台资源
  • 你的PDF太完美了?来给它加点“瑕疵“吧!
  • React派生状态管理:从getDerivedStateFromProps到useEffect+useRef实战
  • Openclaw本地智能体运行时:从部署到自定义工作流实战
  • 嵌入式HAL框架设计:硬件抽象层在智能锁开发中的实践与优化
  • Unlock Music:浏览器端加密音乐文件解锁工具完全指南
  • 单细胞基础模型中间层特征提取:任务与细胞状态依赖的最优表示
  • 文字转手写终极指南:3分钟完成手写作业的免费解决方案
  • 2026年口碑好的山东SGZ刮板输送机/山东刮板输送机刮板高口碑品牌推荐 - 品牌宣传支持者
  • Java原生HttpURLConnection深度解析:流式处理与生产级实践
  • 适配港口复杂工况,以跨镜稳定追踪实现精细化运维管控
  • CURaTE框架在小模型持续遗忘中的实战评估与调优指南
  • Windows免API Key运行Hermes Agent:Grok+PowerShell本地化实战
  • 2026来宾漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • 拆解‘GPT-5.4 mini/nano’:小模型部署的真相与实操指南
  • 2026年知名的佛山家具五金拉手/铝合金拉手家具五金/定制家具五金/佛山家具五金合页优质厂家汇总推荐 - 行业平台推荐
  • mTLS部署实战:从证书管理到K8s集成的可用性提升指南
  • 2026年6月优秀的钢结构幕墙公司哪家好,钢结构幕墙/幕墙/管桁架/钢构/玻璃幕墙/轻钢构/重钢构,钢结构幕墙厂商推荐 - 品牌推荐师
  • 嵌入式GUI开发:emWin窗口管理器核心API详解与实战指南
  • 2026昭通漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • 2026年热门的安徽环保清淤/板框压滤/安徽清淤工程/安徽板框压滤厂家对比推荐 - 行业平台推荐
  • 396逻辑学真题|396逻辑试题|396 199逻辑