当一个连贯建设之后次要分为俩个步骤

1.接管客户端得全副数据
2.接管倒后处理业务流程返回response给客户端
尔他们得辨别就在第一个步骤

BIO和NIO得辨别

1.BIO是期待客户端发数据时候这个过程是阻塞得,造成了一个线程只能解决一个申请得状况,而机器是领有最大线程数的,从而无奈做倒高并发

2.NIO则不同当socket建设好之后,Therad并不会阻塞socket,而是接管到申请之后把申请交给Selector,Selector会遍历socket,如果有socket创立好之后selector会告诉Thread,Thraead在解决业务返回给客户端,这个过程是不会阻塞的,所以Nio能够高并发

Netty为什么传输快

Netty的传输快其实也是依赖了NIO的一个个性——零拷贝。咱们晓得,Java的内存有堆内存、栈内存和字符串常量池等等,其中堆内存是占用内存空间最大的一块,也是Java对象寄存的中央,个别咱们的数据如果须要从IO读取到堆内存,两头须要通过Socket缓冲区,也就是说一个数据会被拷贝两次能力达到他的的起点,如果数据量大,就会造成不必要的资源节约。
Netty针对这种状况,应用了NIO中的另一大个性——零拷贝,当他须要接收数据的时候,他会在堆内存之外开拓一块内存,数据就间接从IO读到了那块内存中去,在netty外面通过ByteBuf能够间接对这些数据进行间接操作,从而放慢了传输速度。

netty的byteBuf 三种应用模式

1.堆缓冲区
堆缓冲区是ByteBuf最罕用的模式,他将数据存储在堆空间。
2.间接缓冲区
间接缓冲区是ByteBuf的另外一种罕用模式,他的内存调配都不产生在堆,jdk1.4引入的nio的ByteBuffer类容许jvm通过本地办法调用分配内存,这样做有两个益处

通过免去两头替换的内存拷贝, 晋升IO处理速度; 间接缓冲区的内容能够驻留在垃圾回收扫描的堆区以外。DirectBuffer 在 -XX:MaxDirectMemorySize=xxM大小限度下, 应用 Heap 之外的内存, GC对此”无能为力”,也就意味着躲避了在高负载下频繁的GC过程对利用线程的中断影响.

3.复合缓冲区
复合缓冲区相当于多个不同ByteBuf的视图,这是netty提供的,jdk不提供这样的性能