JAVA-NIO之Buffer

Buffer属于java nio包下,是一个抽象类
支持如下Buffer类型:
ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer

有三个重要参数:
capacity:内存固定大小值
position:写模式下,position最大为capacity-1,切换到读模式下,position被重置为0
limit:写模式下,表示能最大写入的数据大小,切换到读模式下,表示能读到的数据大小

内存分配:
allocate():请求分配堆内存空间
allocateDirect():请求分配操作系统的直接内存空间

衍生:
HeapByteBuffer和DirectByteBuffer的区别:
1.HeapByteBuffer是在jvm堆内存上申请内存空间,DirectByteBuffer是申请操作系统直接内存
2.如果flush内存数据到远程的话,HeapByteBuffer需要先拷贝到直接内存,然后通过OS级别的send_file,DirectByteBuffer则直经过直接内存这一步,不需要在堆内存和直接内存之间来回拷贝
3.DirectByteBuffer申请的内存会自己检测内存情况,调用System.gc()进行内存清理,从而触发full gc(),另外可以通过将DirectByteBuffer转为DirectBuffer类型然后获取Cleaner调用clean()方法来清理直接内存
4.DirectByteBuffer适用于NIO框架

堆内存和直接内存区别:
1.堆内存是jvm管理的内存,直接内存是操作系统物理内存
2.堆内存申请快清理快,直接内存申请慢清理慢
3.直接内存可用-XX:MaxDirectMemorySize来配置


向buffer中写数据:
1.从Channel写到Buffer
2.通过put方法写到Buffer

从buffer中读数据:
1.从buffer中读数据到Channel
2.通过get()方法从buffer中读数据

重读buffer中数据:
rewind():将position重置为0,limit不变,可以重读数据

清理buffer数据:
clear():只是将position重置为0,limit重置为capacity,并未真正清除数据
compact():以HeapByteBuffer为例,复制未读的内存数据到buffer头部,设置position为limit-之前的position,设置limit为capacity,清除标记位

写模式切换读模式:
flip():调用该方法,将会重置position为0,limit置为之前position的值



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值