javaNIO核心概念

在java的阻塞IO中使用InputStream和outputStream来进行输入和输出,那么两种流是相互独立使用的,而且每次数据传输都要通过“用户态数据”向“os内核态数据”copy或从“os内核态数据”向“用户态数据”copy;

而在javaNIO中我们的核心对象变为channel,select,buffer。那么数据交互的核心是channel和buffer,我们可以通过Stream获取channel也就相当于获取到文件与内存中的数据通道,那么在通道中可以通过buffer相互传递数据,这个特点是NIO特有的。

1:ByteBuffer中有3个核心概念:capacity,limit,position;

(1)capacity相当于整个ByteBuffer的容量,因为在初始化的时候ByteBuffer的容量就已经确定了并且是不可改变的,capacity指向ByteBuffer最后一个字节位置的下一个位置(容量是10,那么就指向10这个位置)。

(2)limit默认状态或者调用了ByteBuffer的clear方法后,都会与capacity相一致。

(3)position默认状态或者调用了ByteBuffer的clear方法后,会在ByteBuffer索引0的位置,position指针会出现在你将要读取的下一个字节那里。

(4)当调用ByteBuffer的flip方法后position指针回到0位置,limit指针从capacity处指向实际数据容量长度的索引位置(ByteBuffer长度10,实际数据长度5,那么limit指针指向索引5的位置)。

(5)ByteBuffer.allocateDirect(10)当使用这个方法创建ByteBuffer的时候,ByteBuffer会出现在heap以外的区域,这样不在jvm堆中的情况实现了 “0 copy”,不再需要将数据从用户态复制到os内核状态,在大量io操作时性能提升会很明显。

2:DirectByteBuffer相当于在heap以外的操作系统内存中直接分配内存,通过JNI调用c语言中的malloc,并且在DirectByteBuffer内部的address成员变量中保存了内存地址offset偏移量。
那么当进行垃圾回收的时候会自动标注DirectByteBuffer的address地址,通过JNI调用本地c语言的free方法

上一篇:Oracle(创建序列)


下一篇:linux命令巧用,随手记