读ByteBuf有感

来源:互联网 发布:超星尔雅刷课软件 编辑:程序博客网 时间:2024/06/05 03:32

由于JAVA NIO的ByteBuffer类存在三个严重的缺点:

- 1。只有一个缓存游标用于复杂的缓存读写操作- 2。缓存的大小固定,没有动态扩展功能,为了不出现缓存溢出异常,需要用户在对缓存进行写操作的时候进行麻烦的可写空间的检测。- 3。没有封装缓存类常用的的方法。(连用于通讯IO常用的方法都没有)

因此ByteBuf对ByteBuf对原生的NIO ByteBuffer进行了扩展,弥补了原生的各种缺陷。
类比StringBuffer扩展String,StringBuffer是线程安全的


看完ByteBuf的类继承结构知道了:

ByteBuf接口实现了ByteBuf的基本操作
AbstractByteBuf对这些接口进行实现
AbstractRefenceCountByteBuf继承了AbstractByteBuf加了引用计数机制

1.之后针对于资源重用对AbstractRefenceCountByteBuf扩展,加入了缓存池机制 Pool
2.针对于内存分配速度扩展了基于JAVA堆分配内存的heapByteBuf,分配速度快,但是不适合用于IO,因为需要耗时的缓存复制
3.针对IO的零拷贝使用directByteBuf,但是由于采用内核分配空间,所以速度有些慢,但是省去了用户层和内核层间的数据拷贝工序


需要注意的3个方法:

discardReadBuffer() 把已经读取(下标0~readindex之间)的内容删除,后面的内容往前面挪动,数据的挪动影响性能
duplicate()方法,软拷贝,共享内存,readindex=writeIndex=0
copy() 深拷贝,不共享内存readindex=writeIndex=0
slice() 软拷贝,将readIndex~writeIndex之间的内容拷贝一份,共享内存,相当于把没读的部分引用过来


flip()

flip的作用有两个:
1. 把limit设置为当前的position值
2. 把position设置为0

0 0
原创粉丝点击