共计 947 个字符,预计需要花费 3 分钟才能阅读完成。
当一个连贯建设之后次要分为俩个步骤
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 不提供这样的性能