netty源码分析(六) - ByteBuf - 2UnpooledByteBufAllocator
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了netty源码分析(六) - ByteBuf - 2UnpooledByteBufAllocator相关的知识,希望对你有一定的参考价值。
参考技术A先来看成员变量:
再看构造方法(方便查看进行了手动内联):
很简单就是在堆内创建一个数组作为字节容器,设置readIndex/writeIndex为0
再看下重写的_setxxx/_getxxx,以int为例
同样很简单,就是数组操作
再看下设置容量方法
还是很简单就是创建新数组,然后copy,然后free原数组
看下常用方法
先来看成员变量:
再看构造方法(方便查看进行了手动内联):
再看下重写的_setxxx/_getxxx,以int为例
再看下设置容量方法
就是创建新的NIO ByteBuffer把原ByteBuffer中字节copy过来,然后需要注意下 setByteBuffer(newBuffer, true); ,tryFree为true会释放原ByteBuf
memoryAddress为分配的ByteBuffer首地址
常用方法
至此UnpooledByteBufAllocator分析完毕,PooledByteBufAllocator留到下一节吧
Netty-源码分析ByteBuf-readSlice和readRetainedSlice使用细节
返回从当前readerIndex开始的此缓冲区的子区域的新分片,并将readerIndex增加新分片的大小(=长度)。
另请注意,此方法将不会调用retain(),因此不会增加引用计数。
跟slice极为相似,只是把原始缓冲区的readerIndex进行了增加
@Override
public ByteBuf readSlice(int length)
checkReadableBytes(length);
ByteBuf slice = slice(readerIndex, length);
readerIndex += length;
return slice;
public static void main(String[] args) throws Exception
ByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;
ByteBuf original = allocator.directBuffer(32);
original.writeByte(1);
original.writeByte(2);
original.writeByte(3);
original.writeByte(4);
//分配子缓冲区
ByteBuf sub = original.readSlice(3);
//原始缓冲区readerIndex=3, readableBytes=1
System.out.println("org.readerIndex = " + original.readerIndex());
System.out.println("org.readableBytes = " + original.readableBytes());
//原始缓冲区引用计数器不变refCnt=1
System.out.println("org.refCnt=" + original.refCnt());
//释放一次
original.release();
public static void main(String[] args) throws Exception
ByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;
ByteBuf original = allocator.directBuffer(32);
original.writeByte(1);
original.writeByte(2);
original.writeByte(3);
original.writeByte(4);
//分配子缓冲区
ByteBuf sub = original.readRetainedSlice(3);
//原始缓冲区readerIndex=3, readableBytes=1
System.out.println("org.readerIndex = " + original.readerIndex());
System.out.println("org.readableBytes = " + original.readableBytes());
//原始缓冲区引用计数器改变refCnt=2
System.out.println("org.refCnt=" + original.refCnt());
//释放一次
original.release();
//子缓冲区再释放一次
sub.release();
System.out.println("org.refCnt=" + original.refCnt());
QQ群:212320390
以上是关于netty源码分析(六) - ByteBuf - 2UnpooledByteBufAllocator的主要内容,如果未能解决你的问题,请参考以下文章
Netty-源码分析ByteBuf-slice和retainedSlice使用细节