为什么用netty

发布时间 2023-09-21 10:55:26作者: 人在代码在

1.BIO什么样?

在JDK1.4 以前java的IO都是BIO(Blocking IO),即阻塞型IO。

BIO模型解读:

  1. 客户端的请求和后端线程数1:1,导致在高并发下,大量创建和销毁线程,开销非常大。甚至可能会发生OOM。
  2. 创建连接后,会创建一个线程,当改线程没有任何操作时候,该线程会一直阻塞,浪费资源。

 

2.NIO什么样?

NIO模型解读:
Buffer:缓冲区,底层通过数组实现,每一种java基本类型都有对应缓冲区。
channel:基于通道实现,和流不同的是,通道是双向的,因此,一个通道可以实现读写操作。
selector:多路复用器/选择器,NIO会启动一个单线程来运行Selector,selector会不断轮询channel,但channel中有事件的时候,就会被selector挑选出来,获取它的SelectionKey集合,SelectionKey中包含不同的事件类型,根据不同的事件类型(OP_ACCEPT, OP_READ, OP_WRITE)进行不同的操作。

NIO的优点:

selector运行在单线程上,处理多个通道,避免了多线程上下文切换带来的系统开销。
一个channel并没有开启一个线程,而是channel中真正有事件的时候,才会开启线程进行读写操作,而BIO为每一个连接都开启了一个线程。
 

3.AIO模型

AIO是真正的异步IO,它将BIO中阻塞的步骤优化成了非阻塞的,但是目前AIO模型存在不足,它依赖于操作系统,window下的AIO性能很高,但是AIO在linux系统下却不完善。