zoukankan      html  css  js  c++  java
  • 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方法

  • 相关阅读:
    【Java学习笔记之二十一】抽象类在Java继承中的用法小结
    【Java学习笔记之二十】final关键字在Java继承中的用法小结
    【Java学习笔记之十九】super在Java继承中的用法小结
    【Java学习笔记之十八】Javadoc注释的用法
    【Java学习笔记之十七】Java中普通代码块,构造代码块,静态代码块区别及代码示例分析
    hdu 5310(贪心)
    poj3268 最短路
    poj1797 最短路
    poj2253 最短路
    poj2387 最短路
  • 原文地址:https://www.cnblogs.com/zzq-include/p/11897907.html
Copyright © 2011-2022 走看看