面试题答案
一键面试关系
Netty是基于Java NIO进行封装和扩展的框架。Java NIO提供了基础的缓冲区管理等核心能力,Netty在此基础上构建更易用、高性能的网络编程框架,其缓冲区管理在一定程度上依赖Java NIO的缓冲区机制。
区别
- 缓冲区创建
- Java NIO:使用
ByteBuffer
等类的静态方法如allocate
、wrap
等来创建缓冲区。例如ByteBuffer buffer = ByteBuffer.allocate(1024);
创建一个指定容量的字节缓冲区,这种方式较为底层和基础。 - Netty:Netty提供了
ByteBuf
,通过Unpooled
工具类创建,如ByteBuf byteBuf = Unpooled.buffer(1024);
。ByteBuf
创建方式更灵活,且Netty有池化机制,可复用缓冲区,减少内存分配开销。
- Java NIO:使用
- 缓冲区使用
- Java NIO:缓冲区读写需要手动调用
flip()
、rewind()
等方法切换读写模式。例如读取数据后要调用flip()
将缓冲区切换到读模式。其索引管理相对复杂,用户需关注position
、limit
等属性。 - Netty:
ByteBuf
读写模式切换更自然,读操作自动推进读索引,写操作自动推进写索引。如byteBuf.writeByte(1);
写入字节后写索引自动增加,byte b = byteBuf.readByte();
读取字节后读索引自动增加,无需手动切换模式,使用更方便。
- Java NIO:缓冲区读写需要手动调用
- 缓冲区释放
- Java NIO:Java NIO缓冲区本身不提供自动释放机制,需要程序员手动管理,若处理不当易造成内存泄漏。
- Netty:对于池化的
ByteBuf
,Netty通过引用计数机制管理释放。当引用计数为0时,缓冲区会被回收,大大简化了缓冲区的释放管理,降低内存泄漏风险。