• nio-buffer


    Nio 是一种非阻塞io模型,在java1.4引入

    • Buffer 缓存区

    • 在nio中,所有数组都是通过缓冲区进行处理的
    • bytebuffer 除了直接内存开辟,底层都是使用了byte[] 作为媒介
    • 几个重要的概念
    • 容量 (capacity) :表示 Buffer 最大数据容量,缓冲区容量不能为负,并且创建后不能更改。
    • 限制 (limit) :第一个不应该读取的数据的索引,即位于 limit 后的数据不可读。缓冲区的限制不能为负,并且不能大于其容量。
    • 位置 (position):下一个要读取或写入的数据的索引。缓冲区的位置不能为负,并且不能大于其限制
    • 标记 (mark) 与重置 (reset) :标记是一个索引,通过 Buffer 中的 mark() 方法指定 Buffer 中一个特定的 position,之后可以通过调用 reset() 方法恢复到这个 position.
    • 代码

    • 创建一个1024大小的缓冲区
    //这里的1024 表示缓冲区的容量
    ByteBuffer allocate = ByteBuffer.allocate(1024);
    
    • 1
    • 2
    • 向缓冲区添加数据, 我们可以向缓存区中添加不同类型的数组,nio已经做好了封装
    
            allocate.putLong(1);
    
            allocate.putInt(2);
            
            allocate.putDouble(1.2);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 读取数据
    		
            allocate.flip(); //将缓存区界限设置为当前位置,并将当前位置重置为0,相当于切换成了读模式
            
             //这里可以想象成了一个解包的过程,我们必须按照加入的顺序读取类型,否则会导致数据不一致
            long aLong = allocate.getLong();
    
            System.out.println(aLong);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 标记与恢复
    		
            allocate.mark();//创建一个position标记
            
            long aLong = allocate.getLong();
    
            int anInt = allocate.getInt();
           
            System.out.println(aLong);
    
            System.out.println(anInt);
    
            allocate.reset(); //恢复到标记处的position
    
            long aLong1 = allocate.getLong();
    
            System.out.println(aLong1);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    堆外内存

    • buffer 中提供了一个很重要的功能,可以让我们直接开辟物理内存,相当于c 语言的 malloc
           ByteBuffer bytebuffer = ByteBuffer.allocateDirect(1024);
    
    • 1
    • 优点 可以减少一次拷贝,提供访问速度

    • 缺点 不好把握,容易内存泄露

    • 直接内存什么时候释放

    • 该块内存不受jvm管理,内部使用了unsafe开辟与回收,当bytebuffer 实例需要被gc回收,会调用unsafe.freeMemory() 释放内存,所以不使用了我们直接bytebuffer=null; 就可以回收掉

    • buffer 中还有一些其它的实现类

    • LongBuffer

    • IntBuffer

    • 除可boolean 没有基本类型都有对应的方法

  • 相关阅读:
    读懂英文文章所需的单词量
    猿创征文|HCIE-Security Day49:AC准入控制SACG
    Linux(Centos)防火墙允许通过端口增加操作记录
    使用seq2seq架构实现英译法
    os实训课程模拟考试(选择题复习)
    NeurIPS 2020 | ChemBERTa+:用于分子性质预测的大规模自监督预训练
    方差迭代公式推导
    自研能力再获认可,腾讯云数据库入选 Forrester Translytical 报告
    回文判断的三种写法
    Unity-UV展开工具
  • 原文地址:https://blog.csdn.net/qq_45535340/article/details/126858385