Java NIO(New I/O,自 JDK 1.4 引入)之所以通常比传统 Java BIO(Blocking I/O,如 InputStream/OutputStream、ServerSocket)性能更高,核心原因在于I/O 模型、线程模型和内存管理方式的不同。下面从几个关键点说明。
read() 在没有数据时会一直阻塞线程Socket socket = serverSocket.accept(); // 阻塞
socket.getInputStream().read(buf); // 阻塞
→ 线程被白白占用,无法做其他事
Selector + 非阻塞 Channelselector.select(); // 只返回就绪的 Channel
✅ 避免线程空等,CPU 利用率更高
Selector selector = Selector.open();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);
✅ 一个线程监听大量连接事件
NIO 提供了更高效的文件/网络传输方式:
磁盘 → 内核缓冲区 → 用户缓冲区 → Socket缓冲区 → 网卡
磁盘 → 内核缓冲区 → 网卡
fileChannel.transferTo(position, count, socketChannel);
✅ 减少内存拷贝和上下文切换
ByteBufferByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer);
✅ 减少 syscall 次数,提高吞吐
| 场景 | BIO | NIO |
|---|---|---|
| 连接数 | 少 | 十万级 |
| 线程数 | 随连接增长 | 固定少量 |
| 扩展性 | 差 | 好 |
| 延迟 | 低(少连接时) | 稳定 |
NIO 的优势主要来自:
在低并发、短连接、简单场景中:
Java NIO 性能更高,是因为它用“非阻塞 + 多路复用 + 零拷贝 + Buffer”解决了 BIO 的线程浪费和频繁 I/O 调用问题。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。