jdk自带ByteBuffer,看名字就知道作用差不多,区别是ByteBuffer读写都用一个指针,ByteBuf读写各有一个指针。
都分为基于java heap的head buffer和基于DirectBuffer的buffer。
DirectBuffer是不能被gc的,用完需要手动释放,虽然麻烦但是效率高,看吧,谁都有优点和缺点。
加上一大堆看名字就知道干嘛的方法。
ByteBuf是个抽象类,源代码里的文档建议使用Unpooled的静态方法创建各种ByteBuf之类。
这些方法分类一下:
buffer* 基于java heap的buf
directBuffer* 基于nio的buffer
wrappedBuffer* 基于底层 byte[]/ByteBuf/ByteBuffer 的视图
compositeBuffer* 多个ByteBuf的组合buffer
copiedBuffer* 复制底层 char[]/byte[]/ByteBuf/ByteBuffer 的可读数据
copy* 基础数据类型转为byte[]
既然叫Unpooled,那说明还有Pooled啦,所谓Unpooled就是每次都分配新的ByteBuf。
Pooled就是分配一个大的buffer,每次都返回大buffer的一个视图。direct buffer和Pooled buffer都是需要手动释放的。然后就引入了一个垃圾收集的经典算法:引用计数,所以推荐使用Unpooled,当使用direct buffer,注意引用计数,防止内存泄露。
本节完。。。
网友评论