当一个连接建立之后主要分为俩个步骤
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不提供这样的功能
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。