Java NIO(New I/O,自 JDK 1.4 引入)之所以在高并发、高吞吐场景下性能通常优于传统 BIO(Blocking I/O),核心原因在于模型设计、系统调用方式、资源消耗和 CPU 利用率的不同。下面从几个关键点说明。
read() / accept() 会阻塞线程✅ 减少线程数量
✅ 减少上下文切换
✅ 提高 CPU 利用率
NIO 的核心是 Selector(多路复用器):
Selector selector = Selector.open();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);
epollkqueueselect / IOCP| 模型 | 线程数 | 可支撑连接 |
|---|---|---|
| BIO | 1:1 | 几百 ~ 几千 |
| NIO + Selector | 1:N | 几万 ~ 上百万 |
NIO 支持零拷贝操作:
FileChannel.transferTo()
FileChannel.map()
磁盘 → 内核缓冲区 → 用户缓冲区 → Socket缓冲区 → 网卡
磁盘 → 内核缓冲区 → 网卡
✅ 减少 CPU 拷贝
✅ 减少上下文切换
✅ 提升文件传输性能
NIO 使用 Buffer 而不是流:
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer);
优点:
BIO:
NIO:
✅ NIO 更适合:
❌ NIO 不一定更好:
Java NIO 性能更好,是因为用“事件驱动 + 多路复用 + 非阻塞 + 零拷贝”替代了“一连接一线程的阻塞模型”,从而大幅降低了线程成本和系统调用开销。
如果你愿意,我也可以:
epoll 原理免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。