核心是采用主从reactor模式:main reactor单线程专责accept,sub reactor按cpu核心数50%~75%配置(如32核配16个),各持独立selector处理固定连接组;配合selectnow()非阻塞轮询、directbytebuffer减少gc、禁用nagle算法及合理tcp参数调优。

优化 Java NIO 网络 IO 吞吐量,核心是让 CPU、内核和网络设备协同高效工作,而不是堆线程或盲目调大缓冲区。关键不在“用不用 NIO”,而在于怎么用对——尤其在多核服务器上真正把硬件资源跑起来。
用主从 Reactor 拆分 Selector 负载
单个 Selector 只能由一个线程驱动,再强的 CPU 也只用上 1 核。吞吐卡住往往不是网络慢,而是事件处理被串行化了。
- Main Reactor 线程专职 accept,收到新连接后轮询分发给 Sub Reactor
- 每个 Sub Reactor 独占一个线程 + 一个独立 Selector,负责固定一批 SocketChannel 的读写事件
- Sub Reactor 数量建议设为 CPU 核心数的 50%~75%,例如 32 核机器配 16 个 Sub Reactor,避免上下文切换过载
优先用 selectNow() 控制事件循环节奏
在高吞吐场景下,select() 的阻塞等待会浪费调度机会;select(long) 的定时唤醒又可能错过突发流量。selectNow() 提供完全非阻塞的轮询能力,把控制权交还给应用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在 Sub Reactor 循环中调用 selectNow(),立即获取就绪通道数,无事件时可插入轻量任务(如统计刷新、心跳检查)
- 配合紧凑的 selectedKeys() 遍历和 iterator.remove(),避免重复处理或漏处理
- 不依赖超时机制,靠外层 while 循环频率调控吞吐弹性,更适合低延迟敏感系统
用 DirectByteBuffer 减少内存拷贝与 GC 压力
网络 IO 频繁分配堆内 ByteBuffer,容易触发 Young GC,暂停时间不可控;而堆外内存绕过 JVM 堆管理,更贴近零拷贝路径。
- SocketChannel 读写统一使用 ByteBuffer.allocateDirect(4096)~ByteBuffer.allocateDirect(65536),按典型报文大小调整
- 避免反复 allocate/deallocate,可结合对象池(如 Netty 的 PooledByteBufAllocator)复用 DirectBuffer
- 注意 DirectMemory 限额:JVM 启动需显式设置 -XX:MaxDirectMemorySize,否则默认仅 0,易触发 OOM
关闭 Nagle 算法并合理设置 TCP 参数
小包粘连和延迟确认会显著拖慢吞吐,尤其在高频交互场景(如实时行情、游戏指令)。
- SocketChannel 设置 StandardSocketOptions.TCP_NODELAY = true,禁用 Nagle
- 根据业务特性调整 SO_RCVBUF / SO_SNDBUF,例如高吞吐推送服务可设为 1MB,避免内核缓冲区频繁溢出重传
- 服务端启用 SO_REUSEADDR,避免 TIME_WAIT 占满端口影响连接建立速率
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










