• 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 没有基本类型都有对应的方法

  • 相关阅读:
    SpringBoot 集成Mybatis
    程序员是不是人均黑客?
    【Linux 之二】Ubuntu下开发环境的搭建(NFS \ SSH \ FTP \ Smba \ ...)
    尚硅谷axios笔记——入门学习
    Python01:数据库操作
    Mac环境下反编译apk
    奇迹mu开服教程:开服服务端的架设及服务器推荐需要那些东西
    大语言模型架构---Transformer 模型
    学习提高:Mac Pro下安装MongoDB,MongoDB远程连接并执行命令
    uniapp的安装与基础
  • 原文地址:https://blog.csdn.net/qq_45535340/article/details/126858385