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的值



猜你喜欢

转载自blog.csdn.net/ignorewho/article/details/80455026