• 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方法

  • 相关阅读:
    tomcat部署https
    Java程序内存的简单分析
    接口设计原则
    英语常用口语
    洛谷 P3956 棋盘
    洛谷 P1101 单词方阵
    二分查找模板(准确找定值)
    洛谷 P1892 [BOI2003]团伙
    浅谈二分的边界问题
    deque简单解析
  • 原文地址:https://www.cnblogs.com/zzq-include/p/11897907.html
Copyright © 2020-2023  润新知