NIO基础

nio non-blocking io 非阻塞io

NIO的三大组件

1、Channel &Buffer

channel 类似于stream,它是读写数据的双向通道,可以通过channel将数据读入buffer,也可以将buffer的数据写入channel,而stream要么是写入,要么是输出,channel相对于strean更加底层

channel的分类:

buffer用于缓存读写数据,常见buffer有:

2、selector 选择器

早期的服务器设计模型是 一个socket对应一个线程,多线程版导致 内存占用高,线程上下文切换成本高,只适合连接数少的场景。

selector的作用是配合一个线程来管理多个channel,获取这些channel上发生的事件,这些channel工作在非阻塞模式下,不会导致线程卡死在一个channel上,适合连接数特别多。流量低的场景。调用selector的select()会阻塞直到channel发生了读写就绪事件,这些事件发生,select方法就会返回这些事件交给thread处理。

ByteBuffer结构:

byteBuffer有一下属性:

capacity,position,limit

为什么要进行buffer的读写切换

allocate

ByteBuffer.allocate(xx); //堆内存,读写效率较低,受到GC影响

ByteBuffer.allocateDirect(xx);//直接内存,不受GC影响,分配效率低,注意释放,否则会造成内存释放。