Java NIO核心面试题
NIO 面试通常会围绕 Buffer、Channel、Selector、零拷贝、BIO/NIO/AIO 对比展开。回答时要体现底层模型和工程取舍。
# 1. NIO 的核心组件是什么
NIO 核心组件是:
Buffer:数据缓冲区。Channel:数据通道。Selector:多路复用选择器。
数据通过 Channel 读入 Buffer,程序从 Buffer 取数据;网络 Channel 可以注册到 Selector,由一个线程监听多个连接事件。
# 2. Buffer 的 position、limit、capacity 是什么
capacity:缓冲区容量。position:下一次读或写的位置。limit:当前读写边界。
写入数据后要调用 flip() 切换为读模式。读完后调用 clear() 或 compact() 准备下一轮写入。
# 3. flip 的作用是什么
flip() 用于从写模式切换到读模式:
limit = positionposition = 0
如果写完数据后忘记 flip(),程序可能读不到刚写入的数据。
# 4. Channel 和 Stream 有什么区别
Stream 面向流,通常单向;Channel 面向缓冲区,通常可以双向读写。
NIO 的 Channel 可以和 Buffer、Selector 配合,实现更灵活的文件和网络 IO。
# 5. Selector 的作用是什么
Selector 允许一个线程监听多个 Channel 的就绪事件,如接收连接、可读、可写。它解决了大量连接下一个连接一个线程的资源浪费问题。
Selector 是 Reactor 模式的重要基础。
# 6. OP_WRITE 为什么不能一直注册
大多数 TCP 连接多数时间都是可写的。如果一直关注 OP_WRITE,Selector 会不断返回写事件,导致 CPU 空转。
正确做法是:只有待写数据没写完时注册 OP_WRITE,写完后取消关注。
# 7. 什么是零拷贝
零拷贝是减少数据在内核态和用户态之间复制的技术。Java 中常见方式是 FileChannel.transferTo 和 transferFrom。
它适合大文件传输、静态文件服务、消息队列文件发送等数据搬运场景。
# 8. BIO、NIO、AIO 区别
- BIO:同步阻塞,一个连接通常对应一个线程。
- NIO:同步非阻塞,通过 Selector 多路复用。
- AIO:异步 IO,操作完成后通过回调或 Future 通知。
Java 服务端高性能网络框架通常更多使用 NIO 模型。
# 9. NIO 是否一定比 BIO 快
不一定。NIO 的优势主要在大量连接和高并发网络场景。简单文件读写或连接数很少的系统中,BIO 更简单,性能也可能足够。
选择 NIO 要考虑复杂度和维护成本。
# 专家答题框架
| 题型 | 回答主线 | 加分点 |
|---|---|---|
| Buffer | position/limit/capacity | flip/clear/compact 状态机 |
| Channel | 与 Buffer 配合读写 | FileChannel、SocketChannel |
| Selector | 多路复用事件模型 | Reactor、OP_WRITE |
| 网络问题 | 粘包、半包、半写 | 协议边界和状态机 |
| 性能问题 | 少线程管理多连接 | Netty 和零拷贝 |
NIO 回答路径:
Buffer 存数据
▼
Channel 搬数据
▼
Selector 等事件
▼
Reactor 分发事件
▼
业务线程处理耗时逻辑
# Tips 快问快答
Q:NIO 核心三件套是什么? A:Buffer、Channel、Selector。
Q:Buffer 为什么要 flip?
A:从写模式切换到读模式,设置读取边界。
Q:Channel 和 Stream 的区别是什么? A:Channel 配合 Buffer,通常更适合双向和非阻塞模型。
Q:Selector 的作用是什么? A:监听多个 Channel 的就绪事件。
Q:OP_WRITE 为什么不能长期注册?
A:Socket 多数时间可写,会导致选择器频繁唤醒。
Q:NIO 如何解决高并发连接? A:用少量线程通过 Selector 管理大量连接事件。
Q:NIO 需要处理哪些网络边界? A:粘包、拆包、半包读、半包写、异常关闭和背压。
Q:为什么生产更常用 Netty? A:Netty 封装了 NIO 复杂细节,提供成熟线程模型和编解码体系。
# 10. 总结
NIO 面试最重要的是讲清楚模型:Buffer 管数据,Channel 管通道,Selector 管多路事件。更深入的回答要能说明粘包拆包、半包写出、OP_WRITE、零拷贝和 Reactor 模式。