关于Netty的一点小知识

1.Netty: Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

 ·应用案例:阿里巴巴的Dubbo,Twitter    


2.Netty应用场景:

·高性能领域  
·多线程并发领域    
·异步通信领域


3.原生NIO的缺陷:

·类库和API繁杂    
·书写复杂    
·工作量和难度大    
·JDK NIO存在BUG


4.Netty优势:

·API简单    
·书写简单    
·性能高    
·成熟稳定,商业应用广


5.Netty对于NIO中的BUG修复

1.对Selector的select操作周期进行统计。    
2.每完成一次空的select操作进行一次计数。    
3.在某个周期内如果连续N次空轮询,则说明触发了JDK NIO的epoll死循环bug。    
4.创建新的Selector,将出现bug的Selector上的channel重新注册到新的Selector上。    
5.关闭bug的Selector,使用新的Selector进行替换。


6.Netty中的ByteBuf 的几种变化过程:

初始化:

在这里插入图片描述
BEFORE discardReadBytes()
在这里插入图片描述
AFTER discardReadBytes()
在这里插入图片描述
BEFORE clear()
在这里插入图片描述
AFTER clear()
在这里插入图片描述
注:以上图片内容来自于JDK1.8.151

 ·比较:       
  |-ByteBuffer缓冲区的长度固定,ByteBuf则对其进行了改进,它会自动扩展,具体的做法是,写入数据时,会调用
  ensureWritable方法,传入我们需要写的字节长度,判断是否需要扩容       
  |-ByteBuffer中只有一个位置指针position,读写需要flip切换


7.直接内存与堆内存

 ·NIO的Buffer提供了一个可以不经过JVM内存直接访问系统物理内存的类——DirectBuffer。 DirectBuffer类继承自
     ByteBuffer,但和普通的ByteBuffer不同,普通的ByteBuffer仍在JVM堆上分配内存,其最大内存受到最大堆内存的
     限制;而DirectBuffer直接分配在物理内存中,并不 占用堆空间,其可申请的最大内存受操作系统限制。    
 ·直接内存的读写操作比普通Buffer快,但它的创建、销毁比普通Buffer慢。因此直接内存使用于需要大内存空间频繁
     访问的场合,不适用于频繁申请释放内存的场合。    
 ·与在JVM堆分配内存(allocate)相比,直接内存分配(allocateDirect)的访问性能更好,但分配较慢。

8.零拷贝

当应用程序需要接收数据的时候,他会在堆内存之外开辟一块内存,数据就直接从IO读到了那块内存中去,在netty里面通过
ByteBuf可以直接对这些数据进行直接操作,从而加快了传输速度。  

在这里插入图片描述
9.Channel数据传输流,与channel相关的概念有以下四个:

* Channel,表示一个连接,可以理解为每一个请求,就是一个Channel。
* ChannelHandler,核心处理业务就在这里,用于处理业务请求。
* ChannelHandlerContext,用于传输业务数据。
* ChannelPipeline,用于保存处理过程需要用到的ChannelHandler和ChannelHandlerContext。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值