Netty的ByteBuf与ByteBuffer相比的优势
- 灵活性和易用性:Java NIO的ByteBuffer虽然提供了对直接内存的支持,但其API相对较低级,使用起来相对繁琐。Netty的ByteBuf则是对Java NIO ByteBuffer的封装,并提供了更加灵活和易用的API,使得开发者可以更方便地操作数据,处理字节缓冲区。
- 可扩展性:Netty的ByteBuf是一个可扩展的缓冲区实现,它支持自动扩容和更高效的内存管理。在大量数据传输时,Netty的ByteBuf可以更好地处理动态增长和缩小,避免了频繁的内存复制和重新分配。
- 零拷贝优化:Netty的ByteBuf实现了“零拷贝”技术,即在数据传输时,可以避免将数据从一个缓冲区复制到另一个缓冲区,从而减少了数据在内存中的多次拷贝,提高了性能。
- 池化支持:Netty的ByteBuf支持内存池,可以通过池化的方式管理内存,降低内存分配和回收的开销,减少了垃圾回收的频率,从而提高了性能和效率。
- 内存释放:Netty的ByteBuf提供了更直观和安全的内存释放方式,开发者无需手动调用clear()或compact()等方法来释放缓冲区,避免了潜在的内存泄漏问题
线程模型了解吗?
就是一个进程可以同时监听多个线程的模式,在最开始的时候是实践,在后面被抽象成了reactor(反应器) 模式。
这里又可以细分为:
- 单线程模型:所有的IO操作都是由同一个NIO线程去完成。就是一个selector对应多个channel。
- 多线程模型:一个线程负责接受请求;一组NIO线程处理IO操作,相当于多个单线程模型去完成IO操作。
- 主从多线程模型:当一个线程负载不了接收请求的工作时,就需要一组NIO线程去处理接收请求,一组NIO线程处理IO操作。
感觉就是套娃,不够就一直加加加。
Netty 的核心组件有哪些?
Netty 的核心组件可以按职责分为启动配置、连接与线程调度、数据缓冲、处理链和异步结果:
- Bootstrap / ServerBootstrap:配置并启动客户端或服务端,指定 EventLoopGroup、Channel 类型、连接地址和处理器等。
- EventLoopGroup / EventLoop:管理 I/O 线程和任务调度。一个 EventLoop 通常由一个线程驱动,可以处理多个 Channel;一个 Channel 注册后通常由同一个 EventLoop 负责,避免并发操作该连接。
- Channel:对网络连接或通道的抽象,负责 I/O 操作,也提供连接状态、地址和对应 Pipeline 的访问入口。
- ChannelPipeline / ChannelHandler:Pipeline 是每个 Channel 的处理器链;Handler 在链上处理入站事件、出站操作或编解码。
- ByteBuf:Netty 的字节缓冲区,读写索引分离,支持堆内存、直接内存、池化及切片等操作。
- ChannelFuture / Promise:表示异步操作的结果,可添加监听器,在连接、写入或关闭等操作完成时收到通知。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 coder-xuyong!
评论




