Java NIO(New I/O,自 JDK 1.4 引入)之所以被认为“高效”,核心在于它在设计模型、系统调用方式和资源利用上与传统 BIO(Blocking I/O)有本质区别。下面从几个关键点说明原因。
BIO 的问题:
read() / accept() 会阻塞线程NIO 的改进:
Channel.configureBlocking(false)✅ 减少线程数 → 减少内存和 CPU 开销
这是 NIO 高效的最核心原因。
每个连接 → 一个线程 → 一个阻塞系统调用
一个线程 + Selector
↓
同时监听大量 Channel 的事件(可读/可写/连接)
底层使用:
epollkqueueIOCP(不同实现)✅ 一次系统调用感知大量连接状态变化 ✅ 避免忙等和大量线程阻塞
BIO:
InputStream.read(byte[])
NIO:
ByteBuffer
✅ 减少 I/O 次数 ✅ 提升吞吐能力
NIO 支持:
FileChannel.transferTo()MappedByteBuffer传统方式:
磁盘 → 内核缓冲区 → 用户缓冲区 → Socket缓冲区
零拷贝:
磁盘 → 内核缓冲区 → 网卡
✅ 减少 CPU 拷贝 ✅ 降低延迟
NIO 天然适合:
线程只处理“就绪事件”,而不是“等待 I/O”
✅ CPU 利用率高 ✅ 扩展性好
| 对比项 | BIO | NIO |
|---|---|---|
| 阻塞 | 是 | 否 |
| 线程模型 | 1 连接 1 线程 | 少量线程管多连接 |
| 底层机制 | read/write | epoll/kqueue |
| 扩展性 | 差 | 好 |
| 高并发 | 容易崩 | 稳定 |
Java NIO 高效,是因为它用“少量线程 + 操作系统事件通知机制 + 缓冲区”,避免了大量线程阻塞和无效等待。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。