NIO系统都有哪些内容?

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。

  1. NIO系统整体模型
    NIO系统都有哪些内容?
  2. 核心原理
    (1)使用Buffer缓冲数据,并且Buffer除了可以使用堆内存以外还可以直接申请使用堆外内存。
    两者之间有什么区别呢?
    使用堆内存有一个拷贝的过程,即如果要进行读写操作,先将堆内存中的数据拷贝到直接内存,然后再进行操作。
    为什么要这么做呢?
    是因为JVM堆中有垃圾收集器,如果不拷贝到直接内存而是在堆中直接将操作命令发给操作系统,在操作系统读写的过程中,如果Java堆中的这块内存被垃圾收集器回收了,那么操作系统就没法继续从这块内存读数据或是向这块内存写入数据了。如果先将堆中的这块内存数据拷贝到直接内存中,那么操作系统直接在直接内存中处理数据,不会受JVM垃圾收集器的影响。一般处理大对象时为了提高效率可以考虑使用直接内存,但是使用前为了避免直接内存的过量使用,最好先通过JVM参数MaxDirectMemorySize设置可以使用的直接内存的大小。
    (2)使用Channel,Channel集IO与网络传输于一体,不用非要等待连接完成和业务处理有返回结果才有响应,而是实时响应,我们只要判断响应中有没有连接和连接中有没有数据就可以了。
    这样做有什么好处呢?
    好处就是非阻塞,就是NIO的核心作用。在发出一个请求后,当前线程无需一直等待有返回结果才能进行其他操作,而是可以一边监听是否有结果一边处理其他业务,当有连接和结果返回时,就处理,如果没有就趁空闲时间做其他事情,并且一个线程可以监听多个请求,而BIO中只能一直等待一个请求。这样单个线程就做到了BIO中分出多个线程才能做的事。
    (3)Selector是对Channel中监听机制的优化,通常我们监听Channel的请求会使用轮询的方式,但是Selector引入了事件监听机制,即注册了要监听的事件以后,如果这个事件发生了就会被通知到。
    (4)Reactor线程模型,因为NIO单线程虽然可以处理很多问题,但是生产中面对大量业务高并发等情况,一个线程就处理不过来了,所以引入了线程池,并且将请求与业务处理等功能进行了单一化处理,使效率更高,容错性更强。
    (5)Netty是对NIO Reactor线程模型的应用,同时对NIO的Channel和Buffer进行了增强,并且引入了职责链设计模式。